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

  1. #1
    Futur Membre du Club
    Calculer de nombreuses différences entre 2 temps de mesure
    Bonjour à tous,

    Je dispose d'une vingtaine de variables mesurées à deux temps différents.
    Dans une étape data j'avais commencé par calculer la différence de chacune de ces variables comme suit :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Data test;
    Diff_var1=Var1_Temps1-Var1_Temps2;
    Diff_var2=Var2_Temps1-Var2_Temps2;
    run;


    Mais je trouve que cela prend beaucoup de place dans le programme et cherche un moyen pour diminuer la taille du programme.
    En cherchant, je pensais passer par des array ou des macro-variables mais je ne connais pas trop ces "outils" de SAS, et ne sais donc pas si c'est possible.

    Auriez-vous une solution à mon problème ?

    Par avance, merci

    Florian

  2. #2
    Membre éprouvé
    Boucle
    Bonjour,

    Une proposition :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    %macro diff_var(nbvar);
      %do i=1 %to &nbvar;
        Diff_var&i = Var&i._Temps1-Var&i._Temps2;
      %end;
    %mend;
     
    data test;
      set test;
      %diff_var(20);
    run;


    Cordialement,

  3. #3
    Futur Membre du Club
    Merci beaucoup !

    Cordialement

  4. #4
    Membre du Club
    Voici une autre approche possible : tu crées un dataset de référence qui te sert à générer ton programme.

    Les données

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    data test;
      var1_temp1=1;
      var1_temp2=2;
      var2_temp1=1;
      var2_temp2=2;
    run;


    Créer le dataset de référence

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    data ref (keep=main name);
        set sashelp.vcolumn (keep=libname memname name
                             where=(upcase(libname)='WORK' and upcase(memname)='TEST'));
        main='diff_' || scan(name,1,'_');
    run;
     
    data ref;
        merge ref (rename=(name=temp1) 
                   where=(upcase(temp1) like '%TEMP1'))
              ref (rename=(name=temp2) 
                   where=(upcase(temp2) like '%TEMP2'));
        by main;
    run;
     
    proc print data=ref noobs;
    run;


    Générer et exécuter le programme avec call execute


    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    data _null_;
        set ref end=eof;
        if _n_=1 then
           do;
               call execute('data test;');
               call execute('set test;');
           end;
        call execute (main || '=' || temp1 || '-' || temp2 || ';');
        if eof then call execute ('run;');
    run;


    Générer et exécuter le programme avec put, filename, %include
    (utilise file print au lieu de file _tmp pour voir le code dans l'onglet Résultat de ton interface).

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    filename _tmp catalog 'work.demo.demo.source';
    data _null_;
        set ref end=eof;
        file _tmp;
        *file print;
        if _n_=1 then
           do;
               put 'data test;';
               put '    set test;';
           end;
        put   main '=' temp1 '-' temp2 ';';
        if eof then put 'run;';
    run;
    %include _tmp;
    filename _tmp;
     
    proc print data=test;
    run;


    Véronique