Salut tout le monde
en faite je cherche à écrire un code SAS qui me permet de tirer à partir de la table matable les nom des variables que leurs observation contiennent le symbole ">" . pour que je puisse faires des instructions pour ces variables ?
Version imprimable
Salut tout le monde
en faite je cherche à écrire un code SAS qui me permet de tirer à partir de la table matable les nom des variables que leurs observation contiennent le symbole ">" . pour que je puisse faires des instructions pour ces variables ?
Bonjour.
Avec un ARRAY et une proc SQL, comme Alers te le proposait dans un autre post traitant exactement de la même question (ou alors je n'ai pas vu la différence).Code:
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 DATA work.tunistat ; /* création d'un jeu d'essai */ INPUT var1 $ var2 $ var3 $ var4 $ var5 $ var6 $ var7 $ var8 $ var9 $ var10 $ ; DATALINES ; a < b c d < e f < g < h < < < i j k l m n o p q r s t u v w ; RUN ; DATA work.variables ; SET work.tunistat ; ARRAY mesVariables $ var1-var10 ; DO OVER mesVariables ; /* sur chaque élément de l'Array */ IF INDEX(mesVariables,"<")>0 /* si cette variable contient un "<" */ THEN DO ; nomVar = VNAME(mesVariables) ; /* on stocke le nom de la variable */ OUTPUT ; /* on conserve en sortie */ END ; END ; RUN ; /* au final, il y aura des doublons si plusieurs observations d'une même variable contiennent des < */ PROC SQL NOPRINT ; SELECT DISTINCT nomVar /* DISTINCT = sans doublons */ INTO : listeVar SEPARATED BY " " FROM work.variables ; QUIT ; /* affichage de la valeur de la macro-variable LISTEVAR dans la log */ %PUT la liste est &listeVar ;
Dans mon cas lorsque je cite la prémiere variable et la dérniere variable séparé par "-" je croise l'erreur suivantequel est le probléme ma table dispose de plus 100 variables les sept prémieres sont numériques le reste est alphanumérique j'ai mais la prémiere variable alphanumérique et la dérniere mais ça fonctionne pasCode:
1
2 ERREUR: Suffixe numérique manquant dans la liste de variables numérotées
Dans tes variables numériques il n'y aura pas de <, on peut donc les oublier.
Une alternative est d'écrire ARRAY mesVariables $ _CHARACTER_ ; et éviter ainsi de les nommer explicitement.
je viens de créer un porgramme macro dans lequel deux variables macro une table et un nom de variable .
je trouve la table3 vide sachant que lorsque je fais avec les macros ça fonctionne correctement .Code:
1
2
3
4
5 %Macro SEPARATION (ds,variable) ; ........... %Mend ; %SEPARATION(work.table3var);
C'est peut-être à cause de la fin de semaine mais je n'ai pas du tout compris ton dernier message. ^^
Peux-tu déjà écrire ici le macro-programme que tu as concocté histoire qu'on puisse t'aider à le corriger si problème il y a ?
Tu dis que tu trouves ta table3 vide mais que ça fonctionne avec des macros. Que veux-tu dire par là ? Quand tu passes par un programme sans macro tu as une table3 vide, mais avec une macro tu obtiens un autre résultat ?
Peut-être que tu ne vois rien dans la log mais que quelque chose cloche. Deux options qui pourraient t'aider à repérer ton problème :
Code:
1
2
3 OPTION MPRINT; /* Inscrit dans la log le code SAS exécuté (tu n'as que le résultat des data step et procédures si tu n'utilises pas cette option. */ OPTION MLOGIC; /* Indique la valeur de tes variables quand tu fais des %IF. */
je suis désolé , j'ai pas bien posé le probléme
au premier lieu j'ai stocké mes variables à traiter comme Olivier a mentionné .
maintenant j'ai crée un macro programme comme suit
l'objectif est de générer le macro programme pour toutes les variables stockés au début .Code:
1
2
3 %Macro SEPARATION (ds,variable) ; ........... %Mend ;
ça ve dire je veux éviter d'écrire à chaque foi
Voila .Code:
1
2
3
4 %SEPARATION(work.table1,var1); %SEPARATION(work.table2,var2); %SEPARATION(work.table3,var3); .................
Merci encore une fois .
A brûle-pourpoint je dirais que tu peux créer une seconde macro, très courte, dans laquelle tu ferais une boucle %DO i = 1 %TO ta valeur maximale.
Et si tu as un nombre de variables et tables qui n'est pas fixe et que tu n'as pas envie d'entrer le nombre, tu dois sans aucun doute pouvoir le stocker automatique dans une macro variable avant.Code:
1
2
3
4
5 %MACRO boucle(nombre=); %DO i = 1 %TO &nombre.; %SEPARATION(work.table&i.,var&i.); %END; %MEND;
dsl la liste des variables pour laquelle je veux génrer mon macro programme est dirivé du programe précédant
Donc la liste est nommée LISTEVARCode:
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 DATA work.tunistat ; /* création d'un jeu d'essai */ INPUT var1 $ var2 $ var3 $ var4 $ var5 $ var6 $ var7 $ var8 $ var9 $ var10 $ ; DATALINES ; a < b c d < e f < g < h < < < i j k l m n o p q r s t u v w ; RUN ; DATA work.VARIABLES ; SET work.tunistat ; ARRAY mesVariables $ var1-var10 ; DO OVER mesVariables ; /* sur chaque élément de l'Array */ IF INDEX(mesVariables,"<")>0 /* si cette variable contient un "<" */ THEN DO ; nomVar = VNAME(mesVariables) ; /* on stocke le nom de la variable */ OUTPUT ; /* on conserve en sortie */ END ; END ; RUN ; /* au final, il y aura des doublons si plusieurs observations d'une même variable contiennent des < */ PROC SQL NOPRINT ; SELECT DISTINCT nomVar /* DISTINCT = sans doublons */ INTO : listeVar SEPARATED BY " " FROM work.VARIABLES ; QUIT ; /* affichage de la valeur de la macro-variable LISTEVAR dans la log */ %PUT la liste est &listeVar ;
donc je devais écrire DISTEVAR au lieu de nombre dans votre propsition ??
Bonsoir,
Dans ce cas la, une ligne à changer dans la proc sql d’Olivier et une petite modification da la macro d’Alers. L’idée est de stocker chaque nom de variable de la liste dans une macro variable.
Bon weekend à vous tousCode:
1
2
3
4
5
6
7
8
9
10
11
12 PROC SQL NOPRINT ; SELECT DISTINCT nomVar, LEFT(PUT(COUNT(*), 4.)) /* DISTINCT = sans doublons */ INTO : mac1-:mac999, :nombre FROM work.VARIABLES ; QUIT ; %MACRO boucle ; %DO i = 1 %TO &nombre.; %SEPARATION(work.table&i., mac&i.); %END; %MEND; %boucle ;