Archive for the ‘cats’ Category

h1

Répéter une action sur plusieurs variables avec le langage macro

août 13, 2008

Sous SAS, deux possibilités sont envisageables pour répéter une action sur plusieurs variables. Dans le cas d’un data step, la syntaxe de l’ARRAY est tout à fait appropriée. Dans d’autres cas, le langage macro peut s’avérer plus pertinent. Voici donc une présentation de l’approche via le langage macro.

1. L’exemple

Pour illustrer le propos, le programme aura pour but de définir un PROC REPORT contenant toutes les variables du data set SASHELP.CLASS. Si on connaît le nom des variables, la syntaxe se résume de la manière suivante.

proc report data=sashelp.class;
   columns name age sex weight height;
   define name   / display;
   define age    / display;
   define sex    / display;
   define weight / display;
   define height / display;
run;

Mais si on ne connaît pas le nom des variables par avance, il faut automatiser la tâche.

2. Remplacer le nom des variables par des macros variables

Dans l’exemple suivant, le nom de chaque variable est sauvegardé dans une macro variable. Ces macros variables ont une structure particulière :

un préfixe commun + un nombre

%let class1 = name;
%let class2 = age;
%let class3 = sex;
%let class4 = weight;
%let class5 = height;

proc report data=sashelp.class;
   columns name age sex weight height;
   define &class1. / display;
   define &class2. / display;
   define &class3. / display;
   define &class4. / display;
   define &class5. / display;
run;

3. Répéter l’instruction DEFINE grâce à une boucle

Grâce à cette structure particulière, une boucle peut être envisagée. L’instruction DEFINE est alors répétée autant de fois qu’il y a de variables. La boucle est définie par une macro variable « I » qui prend des valeurs allant de 1 à 5. La partie nombre de la macro variable est donc remplacée par la valeur de la macro variable « I ».

NOTE : Pour résoudre la macro variable lors de la première boucle, SAS effectue deux lectures. A la première lecture, les deux perluètes (ampersand) && se transforment en un seul ; &i. se transforme en 1. On a donc &CLASS1. A la deuxième lecture, SAS résout la macro variable &CLASS1. comme précédemment.

%macro test;
   proc report data=sashelp.class;
   columns name age sex weight height;
   %do i=1 %to 5
      define &&class&i. / display;
   %end;
   run;
%mend test;
%test;

4. Créer les macros variables de manière automatique

Pour créer les macros variables automatiquement, il faut agir en deux étapes.

  1. Enregistrer chacune des noms de variables du data set choisi dans PROC REPORT (SASHELP.CLASS) dans un nouveau data set (LST_VAR) et plus particulière dans une variable (NAME).
  2. Associer un numéro à chaque nom de variable (compteur) et convertir l’information en macro variable (CALL SYMPUT).

proc sql;
   create table lst_var as
      select name
      from dictionary.columns
      where upcase(libname)=‘SASHELP’ and
            upcase(memname)=‘CLASS’;
quit;

data _null_;
   set lst_var;
   cnt+1;
   call symput (cats(‘CLASS’,put(cnt,best.)),name);
run;

5. Compter le nombre de variables de manière automatique

Si le nombre de variable dans le data set n’est pas connu à l’avance, il faut le retrouver. Cette information est ensuite sauvegardée dans une macro variable, disons MAX_VAR, et remplacera notre nombre 5. L’article « 3 méthodes pour construire des macro variables sans macro » vous donnera plus de précisions concernant la création d’une macro variable.

Obtenir rapidement le nombre de variables dans un data set : Un moyen pour trouver le nombre de variables est de faire appel au dictionnaire de SAS intitulé TABLES.

proc sql noprint;
   select nvar into : max_var
   from dictionary.tables
   where upcase(libname)=‘SASHELP’ and
         upcase(memname)=‘CLASS’;
quit;

Plus de flexibilité sur la liste des variables concernées : Un autre moyen pour compter le nombre de variables est d’agir en deux étapes.

  • Enregistrer dans un variable d’un nouveau data set chacune des noms de variables de SASHELP.CLASS.
  • Compter le nombre d’observations dans ce data set. Vous pouvez vous reporter à l’article « Combien d’observations dans mon data set » pour plus de précisions sur les différentes alternatives.

Dans notre exemple, il s’agit de créer le data set LST_VAR pour la première étape. Le code de la section 4 est tout à fait suffisant pour cela. Ensuite, CALL SYMPUTX peut servir à sauvegarder l’information dans une macro variable.

data _null_ ;
   call symputx(‘max_var’,_N_-1);
   set lst_var;
run;

Pourquoi vous ai-je proposé cette alternative ?  Ici, toutes les variables sont sélectionnées. Mais si seulement quelques une sont choisies, seule la seconde alternative marche. Voici quelques sous-sélections possibles.

  • Sélectionner toutes les variables numériques,
  • Sélectionner toutes les variables finissant pas _X,
  • etc.

En résumé : En résumé, le code se décompose en 2 étapes : créer les macros variables et utiliser ces macros variables pour définir une boucle.

*1. Créer les macros variables CLASS1 à CLASS5, MAX_VAR.;

*1.1 Créer le data set LST_VAR servant de fichier de référence.;

proc sql;
   create table lst_var as
      select name
      from dictionary.columns
      where upcase(libname)=‘SASHELP’ and
            upcase(memname)=‘CLASS’;
quit;

*1.2 Créer les macro variables CLASS1-CLASS5 en se basant sur le data set LST_VAR créé précédemment.;

data _null_;
   set lst_var;
   cnt+1;
   call symput (cats(‘CLASS’,put(cnt,best.)),name);
run;

*1.3 Créer la macro variable VAR_MAX en se basant sur le data set LST_VAR créé précédemment.;

data _null_ ;
   call symputx(‘max_var’,_N_-1);
   set lst_var;
run;

*2. Reporting : appeler les différentes macro variables pour créer la boucle autour de l’instruction DEFINE.;

%macro test;
proc report data=sashelp.class;
   columns name age sex weight height;
   %do i=1 %to &max_var.;
      define &&class&i. / display;
   %end;
run;
%mend test;
%test;

Publicités
h1

La concaténation : 4 fonctions SAS 9

avril 16, 2008

Cet article a été réécrit. Il est maintenant disponible sur programmeur-pro.com.

Mettre des morceaux de textes à la suite les uns des autres et enregistrer le tout dans une variable, c’est ce qu’on appelle la concaténation. D’un côté, il y a la double barre. De l’autre côté, il y a les fonctions « CAT » disponibles depuis SAS 9. Voici donc un rapide tour d’horizon de ces notations.

A titre d’exemple, si vous avez plusieurs variables pour identifier de manière unique une ligne d’observations, vous pouvez construire une variable unique à partir d’une concaténation et ainsi manier plus facilement certaines fonctionnalités de la procédure SQL.

Pour illustrer ce sujet, on utilisera une variable x et une variable z sans blanc aux extrémités et une variable y avec des blancs avant et après sont utilisés.

x = ‘Pays’;
y = ‘  UK  ‘;
z = ‘2008’;

A chaque fois, plusieurs notations sont proposées. Toutes donnent le même résultat.

1. La traditionnelle double barre : qu’il s’agisse de la double barre || ou des deux points d’exclamations !!, la concaténation requiert des valeurs textes (SAS Online Doc. : Section sur « Concatenation Operator »). Il faudra donc convertir les valeurs numériques avec une instruction PUT par exemple.

a1 = x ||  y || z ;

a1 = ‘Pays’ || ‘  UK  ‘ || ‘2008’;

a1 = ‘Pays’ || y || z;

a1 = ‘Pays UK 2008’;

 

Cette notation sert aussi pour la concaténation de matrices (SAS IML) et la définition d’un CALL EXECUTE.

2. Les fonctions CATS, CATX, CATS et CATT : ces fonctions varient en fonction de la place que l’on souhaite accorder aux blancs des différents maillons de la chaîne et si on souhaite ajouter des séparateurs. Elles disposent au moins d’autant de paramètres que de maillons formant la chaîne à créer. Chaque morceau de texte est séparé par une virgule. Si en plus on souhaite ajouter un séparateur entre les différents composants, un paramètre supplémentaire est listé en tête.

Sans blanc aux extrémités : personnellement, j’utilise le plus souvent la fonction CATS qui enlève les blancs aux extrémités. Cela revient à faire d’utiliser la double barre sans agir sur les maillons de la chaînes à construire .

a2 = cats(x,y,z) ;

a2 = cats(‘Pays’,’  UK  ‘,’2008’);

a2 = cats(‘Pays’,y,z);

a2 = ‘PaysUK2008’;

Ajouter un séparateur : la fonction CATX enlève les blancs de début et de fin et ajoute des séparateurs entre chaque « mot ». Le symbole utilisé comme séparateur est le premier paramètre de la fonction.

a3 = catx(‘-‘,x,y,z) ;

a3 = catx(‘-‘,’Pays’,’  UK  ‘,’2008’);

a3 = catx(‘-‘,’Pays’,y,z);

a3 = ‘Pays-UK-2008’;

Garder tous les blancs : la fonction CAT n’enlève pas les blancs au début et fin de texte de chacun des éléments de la concaténation.

a4 = cat(x,y,z) ;

a4 = cat(‘Pays’,’  UK  ‘,’2008’);

a4 = cat(‘Pays’,y,z);

a4 = ‘Pays  UK  2008’;

Enlever les blancs de fin uniquement : la fonction CATT enlève les blancs en fin de chaîne. Le dernier T de CATT fait référence à « Trailing Blanks » c’est-à-dire les blancs de fin de chaîne.

a5 = catt(x,y,z) ;

a5 = catt(‘Pays’,’  UK  ‘,’2008’);

a5 = catt(‘Pays’,y,z);

a5 = ‘Pays  UK2008’;

Pour ma part, j’ai du mal à me souvenir qui fait quoi. L’important, dans un premier temps, est de savoir que ces fonctions existent. On recherche après, en tant voulu, l’information sur les nuances. Si, vous avez trouvez un moyen mnémotechnique pour mémoriser les différences, n’hésitez pas à le faire savoir.