IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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 :

Appliquer une fonction à plusieurs variables


Sujet :

Macro

  1. #1
    Candidat au Club
    Homme Profil pro
    Statisticien
    Inscrit en
    Janvier 2019
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Statisticien

    Informations forums :
    Inscription : Janvier 2019
    Messages : 3
    Points : 2
    Points
    2
    Par défaut Appliquer une fonction à plusieurs variables
    Bonjour,
    je souhaite appliquer une même fonction à plusieurs variables (une centaine). Ces variables contiennent dans leur nom "nbr", les autres qui ne contiennent par ce mot ne serait pas affectées par la variable.
    J'aimerai ne pas changer l'ordre des variables et garder leur nom.
    C'est une logique que je ne possède pas. D'habitude, je le ferai variable par variable mais vu leur nombre je suis obligé d'automatiser.
    Pour l'instant j'ai récupérer leur nom dans une table via un proc contents mais après je suis un peu perdu.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    proc contents data=adm_intermediaire_msp out=test; 
    run; 
     
    proc sql; 
    create table test2  as
    select name
    from test
    where name like ('%nbr%'); 
    quit;
    Est-ce que vous pourriez m'aider ou me guider ?

    Merci,

  2. #2
    Membre éprouvé
    Avatar de m.brahim
    Homme Profil pro
    SAS / BIG DATA
    Inscrit en
    Juillet 2011
    Messages
    461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : SAS / BIG DATA
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2011
    Messages : 461
    Points : 1 119
    Points
    1 119
    Billets dans le blog
    14
    Par défaut
    Bonjour,

    Je te propose cette solution:
    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    data test;
    var1=0;
    var_nbr=1;
    varnbr=2;
    nbr_var=3;
    nbrvar=4;
    var=5;
    output;
    run;
     
    proc contents noprint data=test out=test1; 
    run;
     
     
    data test2(drop=re);
    IF _N_ = 1 THEN DO
     RE = PRXPARSE("/nbr/");
     END;
     RETAIN RE;
     set test1;
      if  PRXMATCH(RE,name)>0 then output;
    run;
     
     
     
    %macro tt();
    data _null_;
    set test2;
    call symputx('val'||strip(_n_),NAME);
    call symputx('nbr', _n_);
    run;
     
    data test;
    set test;
    %do i=1 %to &nbr.;
    &&val&i=&&val&i*5;
    %end;
    run;
     
    %mend tt;
    %tt();
    Cordialement
    Certification des Talents de la programmation In Memory Statistics sur HADOOP:
    http://talents-imstat.groupe-avisia....avance?uid=162

  3. #3
    Membre expérimenté
    Inscrit en
    Novembre 2009
    Messages
    703
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 703
    Points : 1 311
    Points
    1 311
    Par défaut Appliquer une fonction à plusieurs variables
    Bonjour,

    Une alternative ici.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    data test;
      var1=0;
      var_nbr=1;
      varnbr=2;
      nbr_var=3;
      nbrvar=4;
      var=5;
    run;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    var1    var_nbr    varnbr    nbr_var    nbrvar    var
      0        1          2         3          4       5
    1. Créer des macros variables contenant le nom des variables sélectionnées ainsi que le nombre de variables sélectionnées;

    1.1 Créer une table LST_VAR avec la liste des variables sélectionnées.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    proc sql;
       create table lst_var as
          select name
          from dictionary.columns
          where upcase(libname)='WORK' and
                upcase(memname)='TEST' and
                name like ('%nbr%');
    quit;
    1.2 Transformer la table LST_VAR en macro-variables contenant le nom des variables sélectionnées.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    data _null_;
       set lst_var;
       cnt+1;
       call symput(cats('var',put(cnt,best.)),name);
    run;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    %put &var1;
    var_nbr
    %put &var2;
    varnbr
    %put &var3;
    nbr_var
    %put &var4;
    nbrvar
    1.3 Créer une macro-variable NB_VAR avec le nombre de variables sélectionnées.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    data _null_ ;
       call symputx('nb_var',_N_-1);
       set lst_var;
    run;
    2. Créer une boucle en utilisant les différentes macro variables.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    %macro test;
      data test;
        set test;
        %do i=1 %to &nb_var;
          &&var&i=&&var&i*5;
        %end;
      run;
    %mend test;
     
    %test;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    var1    var_nbr    varnbr    nbr_var    nbrvar    var
      0        5         10         15        20       5
    Cordialement,

  4. #4
    Candidat au Club
    Homme Profil pro
    Statisticien
    Inscrit en
    Janvier 2019
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Statisticien

    Informations forums :
    Inscription : Janvier 2019
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    @m.brahim et mgdondon : merci. j'ai utilisé la solution de m.brahim.
    Cependant, je peaufine ma sortie de résultats ; et j'aimerai que les variables dont les valeurs sont inférieures à 10 soient à présent égal à 'N.C' sans changer de variable (ni leur ordre). Le problème de SAS étant dans la gestion des formats et comme les premières variables sont de formats numériques, je ne peux pas attribuer cette valeur 'N.C', le logiciel met à la place une valeur Null...
    Voilà mon code :

    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
     
    proc contents noprint data=extract_msp_non_ano out=ano; 
    run;
     
     data ano2(drop=re);
    IF _N_ = 1 THEN DO
     RE = PRXPARSE("/nbr/");
     END;
     RETAIN RE;
     set ano;
      if  PRXMATCH(RE,name)>0 then output;
    run;
    %macro tt();
    data _null_; /*permet de juste stocker les variables mais de ne pas créer une table */
    set ano2;
    call symputx('val'||strip(_n_),NAME); /*stock une valeur dans l'espace de travail  ici val_N_ est égal nom de la variable*/
    call symputx('nbr', _n_) /* nbr est égal au nombre */;
    run;
     
    data extract_msp;
    set extract_msp_non_ano;
    %do i=1 %to &nbr.;
     
    &&val&i=put(&&val&i, 16.6);
    if &&val&i<10 then &&val&i='NC';
    else &&val&i=&&val&i;
    %end;
    run;
    %mend tt;
    %tt();

  5. #5
    Membre éprouvé
    Avatar de m.brahim
    Homme Profil pro
    SAS / BIG DATA
    Inscrit en
    Juillet 2011
    Messages
    461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : SAS / BIG DATA
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2011
    Messages : 461
    Points : 1 119
    Points
    1 119
    Billets dans le blog
    14
    Par défaut
    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    data test;
    var1=0;
    var_nbr=1;
    varnbr=20;
    nbr_var=3;
    nbrvar=40;
    var=5;
    output;
    run;
     
    proc contents noprint data=test out=test1(keep=name varnum); 
    run;
     
     
    data test2 test22(drop=re);
    IF _N_ = 1 THEN DO
     RE = PRXPARSE("/nbr/");
     END;
     RETAIN RE;
     set test1;
      if  PRXMATCH(RE,name)>0 then output test2;
      else output test22;
    run;
     
     
     
    %macro tt();
    data _null_;
    set test2;
    call symputx('valorg'||strip(_n_),NAME );
    call symputx('valN'||strip(_n_),catt('_',put(varnum,z2.),NAME) );
    call symputx('nbr', _n_);
    run;
     
    data _null_;
    set test22;
    call symputx('valorg1'||strip(_n_),NAME );
    call symputx('val1N'||strip(_n_),catt('_',put(varnum,z2.),NAME) );
    call symputx('nbr1', _n_);
    run;
     
     
    data test_alpha(keep=_:);
    set test;
    %do i=1 %to &nbr.;
    if max(&&valorg&i)<10 then do;
    &&valN&i=put(&&valorg&i, 16.6);
    &&valN&i='NC';
    end;
    else  &&valN&i=put(&&valorg&i,16.6);
    %end;
     
    %do i=1 %to &nbr1.;
    &&val1N&i=&&valorg1&i;
    %end;
    run;
     
    %mend tt;
    %tt();
     
     
    proc contents noprint data=test_alpha out=test_alpha1(keep=name); 
    run;
     
    proc sql;
    select name into: list_name separated by ',' from test_alpha1;
    quit;
     
    proc sql;
    create table test as select &list_name from test_alpha;
    quit;
     
    %macro renommer();
    proc sql noprint;
    select nliteral(name)
      into :  vars1 - 
               from dictionary.columns
      where libname='WORK' and memname=upcase("test") 
    ;
    %let num_vars=&sqlobs;
     
    proc sql noprint;
    select nliteral(prxchange('s/^\_\d+//',-1, name))
      into : varsN1 -
      from dictionary.columns
      where libname='WORK' and memname=upcase("test") 
    ;
     
     
     
    proc datasets library = work;
      modify test;
      rename
    %do i = 1 %to &num_vars.;
        &&vars&i =&&varsN&i.
    %end;
      ;
      run;
    quit;
     
    %mend renommer;
     
    %renommer;
    Cordialement
    Certification des Talents de la programmation In Memory Statistics sur HADOOP:
    http://talents-imstat.groupe-avisia....avance?uid=162

  6. #6
    Candidat au Club
    Homme Profil pro
    Statisticien
    Inscrit en
    Janvier 2019
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Statisticien

    Informations forums :
    Inscription : Janvier 2019
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Merci pour ces réponses!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 22/03/2011, 23h52
  2. Réponses: 0
    Dernier message: 06/08/2010, 16h53
  3. [PHP 5.0] Appliquer une fonction à plusieurs valeurs par référence
    Par gui80 dans le forum Langage
    Réponses: 12
    Dernier message: 09/03/2010, 13h42
  4. [XL-2003] Optimisation d'une fonction à plusieurs variables
    Par kokoVBA dans le forum Macros et VBA Excel
    Réponses: 45
    Dernier message: 06/05/2009, 10h38
  5. Appliquer une fonction à plusieurs dossiers.
    Par MegaBigBoss dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 09/04/2008, 15h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo