Précédent   Forum des professionnels en informatique > Logiciels > Solutions d'entreprise > Business Intelligence > SAS > SAS Base
SAS Base Forum d'entraide sur SAS base : étape data, procédures non statistiques, procédures non graphiques, SQL
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 27/09/2011, 09h54   #1
Invité de passage
 
Inscription : novembre 2010
Messages : 7
Détails du profil
Informations forums :
Inscription : novembre 2010
Messages : 7
Points : 2
Points : 2
Par défaut Séparer table SAS selon différentes valeurs d'une variable

Bonjour,

Je n'arrive pas à trouver une solution à mon problème, du coup, je me tourne vers vous en espérant que quelqu'un pourra me venir en aide...

Voici mon problème : j'ai une table SAS qui comporte un grand nombre de variables. J'aimerais pouvoir scinder ma base selon les valeurs d'une de mes variables.

Je vais prendre un exemple, ce sera peut-être plus clair. Partons de la table suivante :
fruits couleur
pêche orange
abricot orange
cerise rouge
fraise rouge
...

J'aimerais alors scinder cette table selon les différentes valeurs de la variable couleur :
fruits couleur
pêche orange
abricot orange

et

fruits couleur
cerise rouge
fraise rouge

Ce qui me pose problème, c'est que je ne connais pas à l'avance les modalités de ma variable à scinder (variable couleur dans mon exemple).

Alors si vous avez des idées, je suis preneuse..

Merci d'avance !
njacquet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/09/2011, 10h35   #2
Rédacteur
 
Homme Stéphane
Consultant et formateur SAS et Cognos
Inscription : avril 2009
Messages : 1 791
Détails du profil
Informations personnelles :
Nom : Homme Stéphane
Localisation : France, Yvelines (Île de France)

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

Informations forums :
Inscription : avril 2009
Messages : 1 791
Points : 4 012
Points : 4 012
en fait c'est un problème classique qui se résoud de la façon suivante :

tu fais la liste des modalités de COULEUR via une proc FREQ ou un SELECT DISTINCT.
Tu récupères chaque valeur dans autant de macro-variables que nécessaire via un CALL SYMPUTX.
tu crées une boucle avec, permettant de générer autant de ELSE IF que nécessaire :

Code :
1
2
3
4
5
6
7
8
9
10
11
DATA 
%do i= 1 %TO &nbcouleur ; 
table&i
%end;
;
SET masource;
IF couleur="&couleur1" then output table1;
%do i=2 %TO &nbcoouleur;
else IF couleur="&couleur&i" then output table&i;
%end;
run;
Tu peux chercher sur le forum des discussions similaires.
__________________
N'oubliez pas de cliquer sur lorsque votre problème est réglé !

Moteur de recherche dans les papiers SAS
datametric est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/09/2011, 10h36   #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
Bonjour.
Deux solutions sont possibles, aucune n'étant simple à coder.
Soit en langage macro (attention Brice, c'est pour toi ) en collectant (CALL SYMPUTX) les valeurs possibles de couleur dans des macro-variables, puis en faisant une boucle pour chaque valeur.
Soi en une seule étape DATA avec une table de hachage. J'ai mis un exemple à la fin de la doc "le hash expliqué à ma fille" que tu devrais trouver sur ce site ; le code complet et les explications sont en page 4.
Bon courage.
Olivier
olivier.decourt est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/09/2011, 11h25   #4
Membre habitué
 
Homme
Consultant informatique
Inscription : mars 2002
Messages : 211
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Belgique

Informations professionnelles :
Activité : Consultant informatique

Informations forums :
Inscription : mars 2002
Messages : 211
Points : 133
Points : 133
Hello,

@Olivier: super la solution des tables de hash!

Je m'étais penché sur le problème de njacquet et j'essayais de le résoudre d'une autre manière.
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
DATA fruits;
	fruit='banane';
	couleur='jaune';
	output;
	fruit='cerise';
	couleur='rouge';
	output;
run;
 
proc sql noprint;
	SELECT DISTINCT couleur
	INTO :colors separated BY ' '
	FROM fruits;
quit;
J'ai donc récupéeré les couleurs.
Ce qui me permettra de faire le statement data jaune rouge; et de donc déclarer mes tables en output.

Par contre je coince avec la macro.
Code :
1
2
3
4
5
6
7
8
9
10
11
12
 
%macro out_colors_ds;
	DATA &colors ;
		SET fruits;
/* Je récupère la valeur de la variable couleur, que j'attacherai à l'instruction output*/
		call symputx('c',couleur);
                          /* ca coince ici */  
		output &c;
	run;
%mend;
 
%out_colors_ds
J'ai cru voir dans l'aide de SAS que la macro variable crée avec le call symput ne peut pas être appelée dans le même data step qui l'exécute.
J'ai essayé avec un
mais ça ne marche pas.

Je suis curieux de voir si on peut modifier ma macro afin d'obtenir le résultat attendu...
Ou s'il n'est tout simplement pas possible d'y arriver avec mon idée...

Merci pour vos précisions.
L0007 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/09/2011, 11h56   #5
Rédacteur
 
Homme Stéphane
Consultant et formateur SAS et Cognos
Inscription : avril 2009
Messages : 1 791
Détails du profil
Informations personnelles :
Nom : Homme Stéphane
Localisation : France, Yvelines (Île de France)

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

Informations forums :
Inscription : avril 2009
Messages : 1 791
Points : 4 012
Points : 4 012
non mais tu dois décorreller l'output de la création des macro variables.

(à tester je l'ai tapé rapidement)

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
proc freq DATA=masource noprint ORDER=FREQ ;
TABLE couleur / out=mescouleurs ;
run;
 
DATA _null_;
SET mescouleurs;
call symputx( cats("couleur",_n_) , couleur);
call symputx( "nbcoul", _n_);
run;
 
DATA 
%do i= 1 %TO &nbcoul ; 
&&couleur&i
%end;
;
SET masource;
IF couleur="&couleur1" then output &couleur1;
%do i=2 %TO &nbcoouleur;
else IF couleur="&&couleur&i" then output &&couleur&i;
%end;
run;
__________________
N'oubliez pas de cliquer sur lorsque votre problème est réglé !

Moteur de recherche dans les papiers SAS
datametric est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/09/2011, 12h13   #6
Invité de passage
 
Inscription : novembre 2010
Messages : 7
Détails du profil
Informations forums :
Inscription : novembre 2010
Messages : 7
Points : 2
Points : 2
Avec les tables de hachage ça a très bien marché !

Merci beaucoup !!
njacquet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/10/2011, 15h55   #7
Membre habitué
 
Homme
Consultant informatique
Inscription : mars 2002
Messages : 211
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Belgique

Informations professionnelles :
Activité : Consultant informatique

Informations forums :
Inscription : mars 2002
Messages : 211
Points : 133
Points : 133
Hello,

Je viens de lire une petite doc SAS qui m'a fait repenser à ce problème.
Je sais qu'il est déjà résolu mais voici encore une autre manière de faire.
(Mais je pense que la solution d'Olivier est la meilleure)
Ca peut peut-être servir à ceux qui liront ce topic après une recherche:
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
DATA fruits;
	fruit='banane';
	couleur='jaune';
	output;
	fruit='cerise';
	couleur='rouge';
	output;
	fruit='pomme';
	couleur='vert';
	output;
	fruit='poire';
	couleur='vert';
	output;
run;
 
%macro split(DATA=,var=);
	proc sort DATA=&DATA(keep=&var) out=VALUES nodupkey;
		BY &var;
	run;
 
	DATA _null_;
		SET VALUES end=last;
		call symputx('mavar'||LEFT(_n_),&var);
		IF last then call symputx('count',_n_);
	run;
 
	DATA 
		%do i=1 %TO &count;
			&&mavar&i
		%end;
	;
		SET &DATA;
 
		SELECT (&var);
		%do i=1 %TO &count;
			when ("&&mavar&i") output &&mavar&i;
		%end;
		otherwise;
		end;
             run;
%mend split;
 
%split(DATA=work.fruits,var=couleur);
L0007 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 22h46.


 
 
 
 
Partenaires

Hébergement Web