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 :

nom des variables dans un array


Sujet :

Macro

  1. #1
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2003
    Messages
    26
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2003
    Messages : 26
    Points : 23
    Points
    23
    Par défaut nom des variables dans un array
    Bonjour à tous

    mon problème est le suivant :
    je cherche à multiplier des variables (ici P011 jusqu'à P013) par des indicatrices (qui correspondent à des dates) et à stocker ces résultats dans des nouvelles variables (donc créer 3 nouvelles variables par indicatrices)

    le problème est que j'ai 366 indicatrices et j'aimerai pouvoir nommer mes nouvelles variables de manière à pouvoir attribuer chaque variable à une date précise

    j'aurai donc aimé pouvoir récupérer le nom des variables qui sont dans mon array et non pas me contenter d'un simple &i comme dans la partie rouge

    voici ma macro :

    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
    %macro IndicCAR(table, sortie);
    
    DATA _NULL_;
    set &table;
    ARRAY VECTEUR (*) date01_04_2007 -- date31_03_2008 ;
    CALL SYMPUT ('nombre',dim(vecteur));
    RUN;
    
    
    data &sortie;
    set &table;
    array tab (*) date01_04_2007 -- date31_03_2008 ;
    
    %do i=1 %to &nombre.;
    	P011_&i. = P011*tab[&i.];
    	P012_&i. = P012*tab[&i.];
    	P013_&i. = P013*tab[&i.];
    %end;
    run;
    
    %Mend IndicCAR;

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 249
    Points : 290
    Points
    290
    Par défaut
    Bonjour,

    Rajouter une simple macro-boucle ne convient-il pas ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    %do i=1 %to &nombre. ;
       %do j = 1 %to 366 :
          %let k = %substr(%eval(&j+1000),2,3) ;
          P&k._&i = P&k*tab(&i) ;
       %end ;
    %end ;
    Bon courage !

  3. #3
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2003
    Messages
    26
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2003
    Messages : 26
    Points : 23
    Points
    23
    Par défaut
    ton code ne porte pas sur la bonne partie du problème

    je veux garder mes P011 P012 P013, c'est la partir &i que je cherche à modifier par un nom plus identifiable que 1 .. 366

    au final j'aurai 3*366 variables (car nombre = 366)
    le but est de faire une MCO sous contrainte au final

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 113
    Points : 107
    Points
    107
    Par défaut
    Je ferai un proc contents au début pour stocker le nom de chacune de tes variables dans une macro.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    proc contents data = &table (keep = date01_04_2007 -- date31_03_2008 ) out = var noprint;
    run;
     
    data _null_;
      set var;
      call symput('nom_var'!!trim(left(put(_n_,best12.))), trim(name));
    run;
    ta boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    %do i=1 %to &nombre.;
    	P011_&&nom_var&i. = P011*tab[&i.];
    	P012_&&nom_var&i. = P012*tab[&i.];
    	P013_&&nom_var&i. = P013*tab[&i.];
    %end;
    Ce code doit un près marcher

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 249
    Points : 290
    Points
    290
    Par défaut
    Bonjour,

    désolé !
    Je souscris complètement à la solution de lhonolulu !

    Bon courage !

  6. #6
    Rédacteur

    Homme Profil pro
    SAS ALLIANCE SILVER. Consultant et formateur SAS et Cognos.
    Inscrit en
    Avril 2009
    Messages
    2 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : SAS ALLIANCE SILVER. Consultant et formateur SAS et Cognos.
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2009
    Messages : 2 497
    Points : 6 064
    Points
    6 064
    Par défaut
    Tu peux regarder si ca fait ce que tu veux en changeant les p011_3 p012_3 et p013_3 par p011_366 p012_366 et p013_366 après avoir testé.

    Les array Pxx créent les nouvelles variables à . , la boucle les renseigne.

    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
     
    data test;
    input p011 p012 p013 date01_04_2007 date01_05_2007 date31_03_2008 8.;
    datalines;
    1 1 1 100 200 300
    2 2 2 100 200 300
    ;
    run;
     
    data test;
    set test;
     
    array p11 (*) p011_1-p011_3 ;
    array p12 (*) p012_1-p012_3 ;
    array p13 (*) p013_1-p013_3 ; 
     
    array tab (*) date01_04_2007 -- date31_03_2008 ;
     
    do i=1 to dim(tab) ;
     
    	p11(i) = p011*tab(i);
    	p12(i) = p012*tab(i);
    	p13(i) = p013*tab(i);
    end;
     
    run;
    Concernant les MCO sous contraintes, tu as regardé la proc MODEL ou les proc NLP etc ... ?

  7. #7
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2003
    Messages
    26
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2003
    Messages : 26
    Points : 23
    Points
    23
    Par défaut
    merci !
    la solution de lhonolulu est la bonne
    je n'avais jamais utilisé de proc contents dans ce contexte mais je retiens la méthode

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 12/04/2014, 22h32
  2. Noms des variables dans une boucle SAS
    Par Imfafa dans le forum Débutez
    Réponses: 13
    Dernier message: 26/05/2011, 13h42
  3. utilisation des noms des variables dans les conditions
    Par ankhaline dans le forum SAS Base
    Réponses: 4
    Dernier message: 14/08/2010, 14h34
  4. changer le nom des variables dans une boucle
    Par bakaratoun dans le forum MATLAB
    Réponses: 3
    Dernier message: 05/02/2010, 13h50
  5. Réponses: 4
    Dernier message: 30/05/2006, 17h21

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