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 :

Créer une variable à partir d'une macro


Sujet :

Macro

  1. #1
    Nouveau membre du Club
    Inscrit en
    Décembre 2010
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 46
    Points : 30
    Points
    30
    Par défaut Créer une variable à partir d'une macro
    Bonjour

    voilà mon soucis : j'ai une table SAS avec une variable "type" . Je voudrais créer une nouvelle variable à partir de la valeur de "type". Par exemple si type vaut "A" je crée les variables "A_truc" et "A_mahcin".
    J'ai créé les x macro-variables tabtype_i qui correspondent au x possibilités de valeur de la variable.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    %do i=1 %to 8;
       if type="&&TabTyp_&i." then do;
    	Truc_&&TabTyp_&i=; /*fonctionne mais ce n'est pas ce que je veux*/
             &&TabTyp_&i.Truc=;/* NE FONCTIONNE PAS*/
    En espérant être assez claire....

  2. #2
    Membre expérimenté
    Avatar de MEGAMIND2
    Homme Profil pro
    Paris
    Inscrit en
    Janvier 2011
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Paris

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 029
    Points : 1 489
    Points
    1 489
    Par défaut
    Bonjour,
    A vu d'oeil, il te manque des % devant then et do. Si ça ne marche tjs pas, il faudrait poster tout ton code...

  3. #3
    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
    Si j'ai bien compris ton besoin, tu voudrais alimenter des variables différentes en fonction des caractéristiques de ton observation. Sur un cas simple, le code SAS serait (dans ce que j'ai compris) quelque chose comme ça.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    DATA work.test ;
      SET sashelp.class ;
      IF sex="F" THEN DO ;
    	poids_f = weight ;
    	taille_f = height ;
      END ;
      IF sex="M" THEN DO ;
    	poids_m = weight ;
    	taille_m = height ;
      END ;
    RUN ;
    (Pour faire du macro-langage, je préfère partir du résultat.)
    Si on crée (pour le moment à la main) les macro-variables VAL1 et VAL2 qui contiennent les valeurs de SEX alors on a ça.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    %LET val1 = F ;
    %LET val2 = M ;
    DATA work.test ;
      SET sashelp.class ;
      IF sex="&val1" THEN DO ;
    	poids_&val1 = weight ;
    	taille_&val1 = height ;
      END ;
      IF sex="&val2" THEN DO ;
    	poids_&val2 = weight ;
    	taille_&val2 = height ;
      END ;
    RUN ;
    Automatisons donc un peu ça avec une boucle, et une collecte automatique des valeurs de SEX.
    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 cemyr ;
      PROC SORT DATA=sashelp.class OUT=work.valeurs
      			NODUPKEY ;
    	BY sex ;
      RUN ;
      DATA _NULL_ ;
        SET work.valeurs ;
    	CALL SYMPUTX(CATS("val",_N_), sex) ;
    	CALL SYMPUTX("nbVal", _N_) ;
      RUN ;
      DATA work.test ;
        SET sashelp.class ;
    	%DO i=1 %TO &nbVal ;
        IF sex="&&val&i" THEN DO ;
    	  poids_&&val&i = weight ;
    	  taille_&&val&i = height ;
        END ;
    	%END ;
      RUN ;
    %MEND cemyr ;
    %cemyr ;
    Est-ce que c'est bien ce que tu cherches ? Je trouve que ça correspond au code que tu as posé, celui pour lequel tu écris "fonctionne mais pas ce que je veux". Donc je ne suis pas certain d'avoir compris le problème.

    En bonus, on peut (évidemment !) se passer de macro-langage. Avec une (inévitable !!!) proc TRANSPOSE.
    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 work.temp ;
      SET sashelp.class ;
      LENGTH variable $ 32 ;
      valeur = height ;
      variable = CATS("poids_",sex) ;
      OUTPUT ;
      valeur = height ;
      variable = CATS("taille_",sex) ;
      OUTPUT ;
    RUN ;
    PROC TRANSPOSE DATA=work.temp 
                    OUT=work.test (DROP=_NAME_) ;
      ID variable ;
      VAR valeur ;
      BY name sex age ;
    RUN ;
    Et s'il y a plein de variables à traiter ainsi, pas de panique, un petit ARRAY les collectera avec plaisir.
    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 work.temp ;
      SET sashelp.class ;
      LENGTH variable $ 32 ;
      ARRAY vars age height weight ;
      DO OVER vars ;
      	valeur = vars ;
        variable = CATS(VNAME(vars),"_",sex) ;
        OUTPUT ;
      END ;
    RUN ;
    PROC TRANSPOSE DATA=work.temp 
                    OUT=work.test (DROP=_NAME_) ;
      ID variable ;
      VAR valeur ;
      BY name sex age ;
    RUN ;
    Le seul défaut des solutions sans macros est qu'il faut faire deux sessions, une pour les variables de type numérique et une pour les variables de type caractère.
    Bon courage.
    Olivier

  4. #4
    Nouveau membre du Club
    Inscrit en
    Décembre 2010
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 46
    Points : 30
    Points
    30
    Par défaut MERCI
    Super!
    La solution sans macro fonctionne nickel!

    Merci bien!

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

Discussions similaires

  1. [MySQL] créer deux variables à partir d'une variable
    Par subran dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 01/06/2014, 10h42
  2. [JSP] Créer nom variable à partir d'une autre variable
    Par siva27 dans le forum Servlets/JSP
    Réponses: 6
    Dernier message: 30/10/2013, 09h08
  3. Créer une variable à partir d'une autre
    Par Angie1500 dans le forum SAS Base
    Réponses: 8
    Dernier message: 04/05/2012, 16h23
  4. [Batch] Créer une chaine à partir d'une variable et d'une autre chaine
    Par mlle lain dans le forum Scripts/Batch
    Réponses: 1
    Dernier message: 10/11/2009, 16h26
  5. Créer une instance à partir d'une variable ? Possible ?
    Par jpboogie dans le forum ActionScript 1 & ActionScript 2
    Réponses: 2
    Dernier message: 25/04/2009, 09h47

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