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 :

Récupération d'une valeur dans une macro-variable [Fait]


Sujet :

Macro

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 24
    Points : 12
    Points
    12
    Par défaut Récupération d'une valeur dans une macro-variable
    Bonjour,

    A l'intérieur de l'étape data, je souhaiterai récupérer la valeur d'une variable dans une macro-variable afin de l'utiliser dans cette même étape data en sachant que cette valeur de la variable change à toutes les lignes de la table.

    Savez-vous comment faire et si une fonction existe ?

    Merci d'avance.

  2. #2
    Responsable SAS


    Inscrit en
    Septembre 2006
    Messages
    3 176
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 176
    Points : 16 157
    Points
    16 157
    Par défaut
    Bonjour,
    Tu peux utiliser CALL SYMPUT.
    Un exemple illustré est disponible dans la FAQ SAS

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 24
    Points : 12
    Points
    12
    Par défaut
    Citation Envoyé par fafabzh6 Voir le message
    Bonjour,
    Tu peux utiliser CALL SYMPUT.
    Un exemple illustré est disponible dans la FAQ SAS
    C'est ce que j'ai fait au départ mais ma macro variable générée n'était pas utilisable une ligne en dessous dans la même étape data. Or j'ai besoin de cela.

    Par contre CALL SYMPUt fonctionne très bien si c'est pour utiliser cette macro variable en dehors de l'étape data !

  4. #4
    Responsable SAS


    Inscrit en
    Septembre 2006
    Messages
    3 176
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 176
    Points : 16 157
    Points
    16 157
    Par défaut
    Bonjour,
    Que veux-tu faire comme manipulation de macro dans ton DATA?
    Il est toujours possible de travailler sur tes données à l'exterieur de ton DATA (via les macro) et ensuite remettre tout dans ta table avec symget!!

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 24
    Points : 12
    Points
    12
    Par défaut
    Citation Envoyé par fafabzh6 Voir le message
    Bonjour,
    Que veux-tu faire comme manipulation de macro dans ton DATA?
    Il est toujours possible de travailler sur tes données à l'exterieur de ton DATA (via les macro) et ensuite remettre tout dans ta table avec symget!!
    J'ai autant de variables que de modalités pour une variable. Je voudrais créer un top.

    ex :
    (table actuelle)
    sexe top_sexe_1 top_sexe_0
    1 0 0
    1 0 0
    0 0 0
    0 0 0
    1 0 0
    0 0 0

    (table désirée)
    sexe top_sexe_1 top_sexe_0
    1 1 0
    1 1 0
    0 0 1
    0 0 1
    1 1 0
    0 0 1

    Je voudrais récupéré la valeur contenu dans la variable sexe dans la macro variable dénommée "modalite_courante" et faire une ligne de code du genre :
    top_sexe_&modalite_courante. = 1;

    Mais je n'y arrive pas car avec le call symput défini de la sorte CALL SYMPUT ('modalite_courante', sexe); , il reconnait la macro-variable modalite_courante qu'en dehors de l'étape data et pas à la ligne juste en dessous avec : top_sexe_&modalite_courante. = 1; !!!

  6. #6
    Responsable SAS


    Inscrit en
    Septembre 2006
    Messages
    3 176
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 176
    Points : 16 157
    Points
    16 157
    Par défaut
    Bonjour,
    Pourquoi ne pas faire un IF?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IF sexe=0 THEN top_sexe_0=1

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 24
    Points : 12
    Points
    12
    Par défaut
    Citation Envoyé par fafabzh6 Voir le message
    Bonjour,
    Pourquoi ne pas faire un IF?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IF sexe=0 THEN top_sexe_0=1
    Parce que là j'ai fait un code simplifié avec deux modalités mais en réalité j'en ai environ 4000 avec 4001 variables (les 4000 tops + la variable sexe dans l'exemple) pour la première table et c'est une routine que je voudrais utilisée avec différents programmes donc avec le moins possible de choses en figé.

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 24
    Points : 12
    Points
    12
    Par défaut
    Citation Envoyé par fafabzh6 Voir le message
    Bonjour,
    Pourquoi ne pas faire un IF?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IF sexe=0 THEN top_sexe_0=1
    Sinon je peux le faire avec un if mais SAS fera, pour chaque ligne, 4000 tests !!! J'aurai voulu l'optimiser en fait dans la mesure du possible.

  9. #9
    Responsable SAS


    Inscrit en
    Septembre 2006
    Messages
    3 176
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 176
    Points : 16 157
    Points
    16 157
    Par défaut
    Bonjour,
    Est-ce que ça répond à ta question :
    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
    DATA base;
    INPUT sexe top_sexe_1 top_sexe_0;
    CARDS;
    1 0 0
    7 0 0
    0 0 0
    0 0 0
    8 0 0
    0 0 0
    ;
    %MACRO ma;
    DATA base2;
    SET BASE;
    %DO i=1 %TO 10;
    IF sexe=&i THEN top_sexe&i= 1;
    %END;
    RUN;
    %MEND;
    %ma;

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 24
    Points : 12
    Points
    12
    Par défaut
    Citation Envoyé par fafabzh6 Voir le message
    Bonjour,
    Est-ce que ça répond à ta question :
    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
    DATA base;
    INPUT sexe top_sexe_1 top_sexe_0;
    CARDS;
    1 0 0
    7 0 0
    0 0 0
    0 0 0
    8 0 0
    0 0 0
    ;
    %MACRO ma;
    DATA base2;
    SET BASE;
    %DO i=1 %TO 10;
    IF sexe=&i THEN top_sexe&i= 1;
    %END;
    RUN;
    %MEND;
    %ma;
    Certes c'est une possibilité mais le problème c'est que ça sera %TO 4000 donc niveau perf c'est pas top quand on multiplie ça par le nombre de lignes mais s'il n'y a pas d'autres solutions je ferai ça !
    De plus je n'ai pas forcément des chiffres dans la variable sexe ; dans d'autres tables ça peut être h et f comme modalités et dans ce cas je peux toujours m'en sortir en récupérant la liste des modalités avec une proc sql et en faisant défiler les valeurs avec une boucle do.

    Mais j'avoue l'idéal serait d'avoir la valeur de la variable pour une ligne donnée en macro-variable...

    Mais merci beaucoup de te pencher sur mon problème.

  11. #11
    Expert confirmé
    Avatar de olivier.decourt
    Homme Profil pro
    Formateur R/SAS/statistiques
    Inscrit en
    Avril 2008
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Formateur R/SAS/statistiques
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 064
    Points : 4 478
    Points
    4 478
    Par défaut
    Sinon, s'il s'agit de créer des tops, tout est automatisé dans la proc Transreg (fonction CLASS dans l'instruction MODEL). Mais peut-être que j'ai lu la question trop vite.
    En tout cas, utiliser des macro-variables à l'intérieur de l'étape Data où elles sont créées, à la même observations, ça n'a pas beaucoup de sens à mes yeux. L'intérêt des macro-variables est justement de pouvoir stocker une valeur pour l'utiliser en dehors de la lecture de la table d'origine.
    Est-ce qu'un Array ne résoudrait pas le problème, sinon ?

    Olivier

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 24
    Points : 12
    Points
    12
    Par défaut
    Citation Envoyé par olivier.decourt Voir le message
    Sinon, s'il s'agit de créer des tops, tout est automatisé dans la proc Transreg (fonction CLASS dans l'instruction MODEL). Mais peut-être que j'ai lu la question trop vite.
    En tout cas, utiliser des macro-variables à l'intérieur de l'étape Data où elles sont créées, à la même observations, ça n'a pas beaucoup de sens à mes yeux. L'intérêt des macro-variables est justement de pouvoir stocker une valeur pour l'utiliser en dehors de la lecture de la table d'origine.
    Est-ce qu'un Array ne résoudrait pas le problème, sinon ?

    Olivier
    L'array m'a permis de mettre toutes mes variables à 0 mais pour mettre le 1 au bon endroit ça m'est malheureusement pas utile d'après ce que je sais.

    Pour ce qui est de la proc Transreg, je ne la connais pas et je vais creuser cette voie là.

    Certes l'utilisation que je voudrais faire des macro variables n'est pas très habituelle voire déontologique ; je te l'accorde mais elle me serait utile aujourd'hui pour résoudre mon problème.

    Merci tout de même de ta réponse.

  13. #13
    Expert confirmé
    Avatar de olivier.decourt
    Homme Profil pro
    Formateur R/SAS/statistiques
    Inscrit en
    Avril 2008
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Formateur R/SAS/statistiques
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 064
    Points : 4 478
    Points
    4 478
    Par défaut
    Voilà un exemple de Transreg, j'ai l'impression que ça résoud ton problème.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    PROC TRANSREG DATA = sashelp.class DESIGN NOPRINT ;
    	MODEL CLASS(age sex / ZERO=NONE SEP=":") ;
    	ID name weight height ; /* variables à copier */
    	OUTPUT OUT = work.avecTops (DROP = _type_ _name_ intercept) ;
    RUN ;
    Olivier

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 24
    Points : 12
    Points
    12
    Par défaut
    Citation Envoyé par auredura Voir le message
    L'array m'a permis de mettre toutes mes variables à 0 mais pour mettre le 1 au bon endroit ça m'est malheureusement pas utile d'après ce que je sais.

    Pour ce qui est de la proc Transreg, je ne la connais pas et je vais creuser cette voie là.

    Certes l'utilisation que je voudrais faire des macro variables n'est pas très habituelle voire déontologique ; je te l'accorde mais elle me serait utile aujourd'hui pour résoudre mon problème.

    Merci tout de même de ta réponse.
    Bizarre la proc Transreg zappe une modalité dans le recodage :

    ex :
    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
    data sexe;
    input sexe $;
    cards;
    h
    f
    h
    f
    h
    f
    h
    f
    h
    f
    h
    f
    h
    ;
    run;
    proc transreg data=sexe design;
    	model class(sexe);
    	output;
    run;
    résultat :
    fichier capture joint

    Je n'ai pas la variable sexeh malheureusement même si elle peut se déduire ; il n'y a pas un moyen de l'avoir ?

    Mais bien utile cette proc transreg avec l'option design
    Images attachées Images attachées  

  15. #15
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 24
    Points : 12
    Points
    12
    Par défaut
    Citation Envoyé par auredura Voir le message
    Bizarre la proc Transreg zappe une modalité dans le recodage :

    ex :
    data sexe;
    input sexe $;
    cards;
    h
    f
    h
    f
    h
    f
    h
    f
    h
    f
    h
    f
    h
    ;
    run;
    proc transreg data=sexe design;
    model class(sexe);
    output;
    run;

    résultat :
    fichier capture joint

    Je n'ai pas la variable sexeh malheureusement même si elle peut se déduire ; il n'y a pas un moyen de l'avoir ?

    Mais bien utile cette proc transreg avec l'option design
    Autant pour moi c'est le zero=none !!!!!

    Merci beaucoup tu as solutionné mon problème avec la proc transreg qui va m'être dorénavant très utile en me faisant gagner plein de temps.

    Je reste un peu sur ma faim avec les macro-variables mais c'est certainement pas possible de faire ce que je désirai en passant par les macros variables.
    Enfin si quelqu'un a la solution je reste preneur.

    Mais mon problème est solutionné.
    Merci encore.

  16. #16
    Expert confirmé
    Avatar de olivier.decourt
    Homme Profil pro
    Formateur R/SAS/statistiques
    Inscrit en
    Avril 2008
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Formateur R/SAS/statistiques
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 064
    Points : 4 478
    Points
    4 478
    Par défaut
    Petite friandise supplémentaire : après la proc transreg, une macro-variable &_trgind contient le nom de tous les tops créés.

  17. #17
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 24
    Points : 12
    Points
    12
    Par défaut
    Citation Envoyé par olivier.decourt Voir le message
    Petite friandise supplémentaire : après la proc transreg, une macro-variable &_trgind contient le nom de tous les tops créés.
    Très bon à savoir... Merci.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 13/04/2015, 11h17
  2. Réponses: 9
    Dernier message: 04/11/2009, 14h54
  3. Réponses: 2
    Dernier message: 24/02/2009, 17h40
  4. Recherche une valeur d'une cellule dans une colonne d'une autre feuille
    Par kourria dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 21/06/2007, 13h48
  5. Mettre une valeur d'une table dans une variable
    Par Raphou96 dans le forum Access
    Réponses: 5
    Dernier message: 06/02/2006, 15h19

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