Les posteurs les plus actifs de la semaine
Eric Wajnberg
 
patraster
 
ameliev
 
Coco
 


Macro et liste de variable

Aller en bas

Macro et liste de variable

Message par mar1ne le Jeu 26 Fév 2015 - 10:15

Bonjour à tous,

je travaille actuellement sur une base de données qui concerne des enfants en bas âge.
Un même questionnaire a été posé à la mère puis au père, ce qui signifie que je dispose, pour les variables concernant l'enfant, d'une variable père et d'une variable mère. Je souhaiterais maintenant n'avoir qu'une seule variable en affectant les réponses du père à la mère lorsque cette dernière n'a pas répondu.

Les manipulations étant identiques pour chaque variable, je me suis orientée vers les macros et voici le petit programme que j'ai écrit pour une seule variable :


Code:
%macro recodage(entree,sortie,var_pere,var_mere);
data lib.&sortie;
set lib.&entree;
if &var_mere=. and &var_pere ne . then &var_mere=&var_pere;
run;
%mend;

Il fonctionne très bien mais je voulais savoir s'il était possible de donner en paramètre une liste de variables père et une liste de variables mère, afin que sas fasse tous les changements en une seule ligne au lieu d'avoir à répéter l'appel de la macro pour chaque variable (j'en ai pas mal !!).

Merci de votre aide,

Marine

mar1ne

Nombre de messages : 14
Age : 30
Date d'inscription : 08/01/2010

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: Macro et liste de variable

Message par niaboc le Jeu 26 Fév 2015 - 15:34

Bonjour,

oui c'est possible.

Tu peux faire un truc dans ce genre, avec en paramètre la liste de tes variable pères et la liste de tes variables mères séparées par des espaces.

Code:
%macro recodage(entree,sortie,var_pere,var_mere);

   %let i=1;
   %do %while (%scan(&var_pere,&i," ") ne );
      %let var_pere&i=%scan(&var_pere,&i," ");
      %let i=%eval(&i+1);
   %end;

   %let j=1;
   %do %while (%scan(&var_mere,&j," ") ne );
      %let var_mere&j=%scan(&var_mere,&j," ");
      %let j=%eval(&j+1);
   %end;

      
   %let nb_var_pere=%eval(&i-1);
   %let nb_var_mere=%eval(&i-1);

   %if &nb_var_pere=&nb_var_mere %then %do;

      data &sortie;
         set &entree;
         %do i=1 %to &nb_var_pere;
            %put nous traitons la variable père : &&var_pere&i et la variable mère : &&var_mere&i;
            if &&var_mere&i=. and &&var_pere&i ne . then &&var_mere&i=&&var_pere&i;
         %end;
      run;

   %end;

%mend;

%recodage(sashelp.citiday,test,DSIUSWIL SNYSECM, DFXWUK90 DFXWCAN);

Dis-moi si c'est ok!

Niaboc
avatar
niaboc

Nombre de messages : 951
Age : 31
Localisation : Paris
Date d'inscription : 05/05/2008

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: Macro et liste de variable

Message par mar1ne le Ven 27 Fév 2015 - 8:28

Oui c'est parfait ca marche très bien.

Par contre je ne comprends pas bien la condition d'arrêt du do while, j'aurais rajouté un " " après le ne non ?

Merci de ton aide en tous cas.

mar1ne

Nombre de messages : 14
Age : 30
Date d'inscription : 08/01/2010

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: Macro et liste de variable

Message par niaboc le Ven 27 Fév 2015 - 13:45

non car ce n'est pas une variable texte, pour les macro-variables le vide n'est donc pas à mettre entre guillemet.

Tu peux essayer, en faisant également un
Code:
%put &i;
; tu verras que la boucle ne s'arrête jamais car la condition n'est jamais remplie.

Niaboc
avatar
niaboc

Nombre de messages : 951
Age : 31
Localisation : Paris
Date d'inscription : 05/05/2008

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: Macro et liste de variable

Message par Contenu sponsorisé


Contenu sponsorisé


Revenir en haut Aller en bas

Revenir en haut

- Sujets similaires

 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum