Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macro Discussion :

Boucle et macro avec une liste de variables


Sujet :

Macro

  1. #1
    Membre à l'essai
    Boucle et macro avec une liste de variables
    Bonjour à tous,

    Je vous remercie par avance pour l'aide que vous pourrez m'apporter.

    Je souhaite créer une boucle en utilisant un macro programme qui serait exécuté pour plusieurs variables qui n'ont pas le même nom.

    Par exemple:

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    %macro test;
     
     %do ?? %to ??;
    proc freq data = ma_table;
    table cla_age_5*ben_sex_cod*&variable_a_changer /nopct nocol norow out= freq_CanColo_act;
    run;   
    %end;
     
    %mend test;


    avec des noms de variables pour &variable_a_changer pouvant être top_CanColo_act, top_CanPoum_act, etc.

    En conclusion, je ne sais pas comment faire une boucle avec une liste de variables.
    Merci par avance pour votre aide.

    Camille

  2. #2
    Expert confirmé
    Bonjour.
    Déjà, si toutes les variables à croiser sont sur le même principe de nom (commencent par "top_Can"), pas besoin de langage macro.
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    proc freq data = ma_table;
    table cla_age_5*ben_sex_cod*(top_can<img src="images/smilies/icon_smile.gif" border="0" alt="" title=":)" class="inlineimg" /> /nopct nocol norow out= freq_CanColo_act;
    run;

    Ensuite, s'il y a des noms pas cohérents, ou qui ont d'autres principes qu'un début de nom en commun (par exemple, qui se finissent par "_act"), un peu de macro-langage pour en faire la liste (via proc SQL) mais toujours pas besoin d'un macro-programme.
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    PROC SQL ;
      SELECT name INTO : liste_var SEPARATED BY " "
      FROM dictionary.variables
      WHERE UPCASE(libname) = "WORK"
       AND UPCASE(memname)="MA_TABLE" /* à adapter à l'emplacement des données */
       AND UPCASE(name) LIKE '%_ACT'
      ;
    QUIT ;
    proc freq data = ma_table;
    table cla_age_5*ben_sex_cod*(&liste_var) /nopct nocol norow out= freq_CanColo_act;
    run;


    Enfin pour répondre à la demande initiale, on ne boucle pas directement sur les noms des variables. On stocke ceux-ci dans des macro-variables numérotées (par exemple NOM1 NOM2 NOM3 etc.) avec CALL SYMPUTX ou SELECT INTO, puis une boucle qui va de 1 au nombre de variables (souvent récupéré également dans une macro-variable). Si i est le compteur de boucle, &&NOM&i est le nom de la i-ème variable.
    Bon courage.
    Olivier

  3. #3
    Membre à l'essai
    Bonjour Olivier,

    Merci beaucoup pour votre réponse. Je n'avais effectivement pas pensé à ces solutions qui semblent bien plus simple.
    Et merci aussi pour la réponse pour la boucle. Par curiosité, j'essaierai quand même de programmer ça juste pour voir si j'y arrive.

    Merci, merci!!!