logo

La proc TRANSPOSE expliquée à ma fille

De nombreux cas de figure dans SAS nécessitent de réorganiser les données de manière à changer ce que représente une observation dans une table. Des pivots (en général partiels) dans les données sont alors à envisager ; la procédure TRANSPOSE est l’outil privilégié pour les pivots.

C’est quoi un pivot ?

L’exemple ci-dessous illustre un pivot partiel de la variable Y selon la variable IDENT. La variable X, elle, est perdue. A l’intérieur de chaque bloc de IDENT dans la table d’origine, chaque observation vient alimenter une colonne dans la table transposée. (Cliquer sur les images pour les voir dans une plus grande résolution.)

pivot 1

On peut également utiliser les valeurs d’une variable pour nommer les nouvelles variables, plutôt que d’utiliser un nommage automatique comme ci-dessous (VAR1, VAR2, VAR3 sont des noms automatiques).

Voici un second pivot partiel de la même table. Cette fois, on utilise les valeurs de la variable X comme nom des nouvelles variables. Attention, ces valeurs doivent être des noms de variables SAS licites ; de plus, on ne doit pas avoir de doublons de X à l’intérieur d’un bloc de ID.

pivot 2

Syntaxe simplifiée de la procédure Transpose

PROC TRANSPOSE DATA = tableLue OUT = tableTransposée PREFIX = … ;
  BY … ;
  VAR … ;
  ID … ;
RUN ;

On donne dans PREFIX la racine commune des noms de nouvelles variables, en cas de nommage automatique. Dans BY, on indique la variable fixe du pivot (dans les exemples précédents, la variable IDENT) ; dans VAR, la variable à transposer (Y dans l’exemple) ; dans ID, une variable contenant le nom des nouvelles colonnes à alimenter (X dans l’exemple).

Cas 1 : transposer une variable (facile !)

PROC SORT DATA = sashelp.class OUT = work.class ;
  BY sex ;
RUN ;
PROC TRANSPOSE DATA = work.class OUT = work.Tclass ;
  BY sex ;
  VAR age ;
RUN ;

transposer une variable, avant/après

Cas 2 : transposer plusieurs variables (moins immédiat, 2 solutions)

Solution 1 : faire une proc Transpose par variable, puis fusionner (MERGE) les tables transposées en une seule

PROC SORT DATA = sashelp.class OUT = work.class ;
  BY sex ;
RUN ;
PROC TRANSPOSE DATA = work.class OUT = work.Tage PREFIX=age ;
  BY sex ;
  VAR age ;
RUN ;
PROC TRANSPOSE DATA = work.class OUT = work.Tnom PREFIX=nom ;
  BY sex ;
  VAR name ;
RUN ;
DATA work.Tclass ;
  MERGE work.Tage work.Tnom ;
  BY sex ;
RUN ;

transposer 2 variables, solution 1

Solution 2 : préparer les données en doublonnant les lignes avec une étape Data. Convient mieux pour transposer un grand nombre de variables.

PROC SORT DATA = sashelp.class OUT = work.class ;
  BY sex ;
RUN ;
DATA work.class ;
  SET work.class ;
  BY sex ;
  LENGTH nomVar $ 32 ;
  IF FIRST.sex THEN compteur = 0 ;
  compteur + 1 ;
  nomVar = COMPRESS("nom"!!compteur) ;
  valeur = name ; /* pas de PUT car données caractère */
  OUTPUT ; /* écrit une ligne */
  nomVar = COMPRESS("age"!!compteur) ;
  valeur = PUT(age, 3.) ; /* PUT car données numériques */
  OUTPUT ;
RUN ;
PROC TRANSPOSE DATA = work.class OUT = work.Tclass ;
  BY sex ;
  VAR valeur ;
  ID nomVar ;
RUN ;

transposer 2 variables, solution 2

192 found this helpful