Précédent   Forum des professionnels en informatique > Logiciels > Solutions d'entreprise > Business Intelligence > SAS > Macro
Macro Forum d'entraide sur le langage Macro de SAS
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 07/12/2011, 12h48   #1
Candidat au titre de Membre du Club
 
Inscription : décembre 2010
Messages : 33
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 33
Points : 10
Points : 10
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 :
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....
cemyr est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/12/2011, 13h05   #2
Membre Expert
 
Avatar de MEGAMIND2
 
Homme Brice Beare
Paris
Inscription : janvier 2011
Messages : 957
Détails du profil
Informations personnelles :
Nom : Homme Brice Beare
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Paris

Informations forums :
Inscription : janvier 2011
Messages : 957
Points : 1 368
Points : 1 368
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...
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/12/2011, 13h30   #3
Expert Confirmé
 
Avatar de olivier.decourt
 
Homme Olivier Decourt
Formateur en informatique
Inscription : avril 2008
Messages : 1 467
Détails du profil
Informations personnelles :
Nom : Homme Olivier Decourt
Âge : 34
Localisation : France

Informations professionnelles :
Activité : Formateur en informatique
Secteur : Conseil

Informations forums :
Inscription : avril 2008
Messages : 1 467
Points : 2 828
Points : 2 828
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 :
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 :
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 :
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 :
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 :
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
olivier.decourt est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 08/12/2011, 10h11   #4
Candidat au titre de Membre du Club
 
Inscription : décembre 2010
Messages : 33
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 33
Points : 10
Points : 10
Par défaut MERCI

Super!
La solution sans macro fonctionne nickel!

Merci bien!
cemyr est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 18h23.


 
 
 
 
Partenaires

Hébergement Web