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 18/05/2008, 17h08   #1
Nouveau Membre du Club
 
Inscription : mai 2008
Messages : 45
Détails du profil
Informations forums :
Inscription : mai 2008
Messages : 45
Points : 32
Points : 32
Par défaut Concaténation de table de sortie SAS

Bonjour, est ce quelqu'un peut m'aider ?
j'ai plusieurs fichiers contenant plusieursvariables, j'ai du faire une macro fonction de tel sorte a l'appliquer sur chaque fichier, cette boucle contient une procedure freq qui me fait sortir des tables sas pour chaque variable de mon fichier, les sortie table sas freq contiennent les variables de longueur differente, certains ont 2 voir 3 voir 4 modallités, j'aurais souhaiter concatener ces tables en largeur !! help
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
%macro test5(fichier);
 
DATA donnesN;
SET &fichier;
keep _NUMERIC_;
run;
 
DATA cara;
SET &fichier;
keep _CHARACTER_;
run;
 
DATA cara;
SET cara;
IF DATA=cara then do;
proc contents DATA=cara out=Descar;
run;
end;
 
     else do;
         proc means DATA= donnesN  n nmiss min Q1 median Q3 max mean std ; 
         var _ALL_;
         output out= work.quanti; 
         run;
		 end;
 
 
 
%let i= _N_;
DATA Descar;
SET  Descar;
call symput(compress("nomvar"||_N_),NAME);
varId=symget("nomvar"||LEFT(put(_N_,4.)));
/*call symput(compress("var"||_N_),varnum);
vaId=symget("var"||left(put(_N_,4.)));
run;/*;
 
 
/*%global num;
data _NULL_; 
if 0 then set Descar nobs=NAME;
call symput("num",left(put(NAME)));
stop;
run;/*;
 
/*%let nomb=_N_;*/;
/*data Des;
set Descar;
call symput(compress("var"||_N_,varnum);
vaId=symget("var"||left(put(_N_,4.)));
run;*/
run;
DATA Des;
SET  Descar;
call symput(compress("nomvarr"||_N_),VARNUM);
varId=symget("nomvarr"||LEFT(put(_N_,4.)));
run;
 
%LOCAL num;
 
DATA Des;
IF 0 then SET Des nobs=VARNUM;
call symput('num',LEFT(put(VARNUM,8.)));
stop;
run;
 
 
DATA cara;
SET  cara;
 
/*data _null_;
if 0 then set cara nobs=count;
call symput('num',left(put(count,8.)));
stop;
run;*/;
 
 
%do i=1 %TO # 
 
    proc freq DATA=cara ORDER=freq;
    TABLES &&nomvar&i/out=table&i;
DATA tabl&i;
SET  table&i;
IF _N_ le 10;
DROP table&i;
	%end;
run;
%mend;
%test5(exatraitPS);
mamiche est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/05/2008, 19h04   #2
Membre Expert
 
Inscription : mars 2005
Messages : 1 028
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 1 028
Points : 1 278
Points : 1 278
Envoyer un message via Yahoo à bahraoui
Bonjour,
Dans le programme ci-dessous je crée deux tables avec des formats différentes. Je crée une table résultats (vide) avec des formats MAX.
La macro me permet d'empiler ces tables.
J' espère que ce programme résoudra ton problème.
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
 
DATA toto1;
format var1 $2. var2 $2.;
input var1 var2;
cards;
a1 b1
a2 b5
a2 b2
a3 b1
a3 b3
a3 b4
;
run;
DATA toto2;
format var1 $4. var2 $3.;
input var1 var2;
cards;
a1 b1
a2 b5
a2 b2
a3 b1
a3 b3
a3 b4
;
run;
proc sql; 
CREATE TABLE toto0 (var1 char(5), var2 char(5));
quit;
%macro empiler(nb_tb);
DATA res; SET 
%do i=0 %TO &nb_tb;
	toto&i
%end;;
run;
%mend;
%empiler(2);
bahraoui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/05/2008, 20h41   #3
Nouveau Membre du Club
 
Inscription : mai 2008
Messages : 45
Détails du profil
Informations forums :
Inscription : mai 2008
Messages : 45
Points : 32
Points : 32
merci BAHRAOUI,
j'essayerai demain, j'espere que ça va marcher
merci beaucoup
mamiche est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/05/2008, 21h00   #4
Nouveau Membre du Club
 
Inscription : mai 2008
Messages : 45
Détails du profil
Informations forums :
Inscription : mai 2008
Messages : 45
Points : 32
Points : 32
moi ce que j'ai c'est

table 1
"admission hopital" "frequence" "effectifs"
deces 30 40
mydriase 15 50

table2
"reanimation" "frequence" "effectifs
debut 10 40
milieu 27 59
fin 30 10
deces 29 20

j'ai dix tables elles ont toutes un nombre de modalités different, toi le programme que tu propose, je suppose qu'il empile les de haut en bas; or moi ce que je veux c'est qu'il mette les tables en largeur, car le nombre de modalités n'est pas le même pour cahque table et donc pour chaque variable
merci
mamiche est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/05/2008, 21h30   #5
Membre Expert
 
Inscription : mars 2005
Messages : 1 028
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 1 028
Points : 1 278
Points : 1 278
Envoyer un message via Yahoo à bahraoui
Bonsoir,

ça risque d'être un plus peu plus compliqué:
Il faut renommer les colonnes et faire un merge au lieu du set.

Cordialement.
bahraoui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/05/2008, 21h42   #6
Nouveau Membre du Club
 
Inscription : mai 2008
Messages : 45
Détails du profil
Informations forums :
Inscription : mai 2008
Messages : 45
Points : 32
Points : 32
donc t'as compri ce que je voulais

Admission hopital deces mydriase Reanimation debut milieu fin deces
frequence
effectifs

et voila est ce que tu penses que c'est possible c'est une concatenation de chaine de caractère ?
merci
mamiche est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/05/2008, 21h47   #7
Membre Expert
 
Inscription : mars 2005
Messages : 1 028
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 1 028
Points : 1 278
Points : 1 278
Envoyer un message via Yahoo à bahraoui
il ya une transposition avant de fusionner les tables.

Est ce que c'est possible de donner une exemple avec deux tables. Avec les différentes transformations que tu veux? Cela nous permettra de te donner très vite une solution.
bahraoui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/05/2008, 22h16   #8
Nouveau Membre du Club
 
Inscription : mai 2008
Messages : 45
Détails du profil
Informations forums :
Inscription : mai 2008
Messages : 45
Points : 32
Points : 32
franchement c'est gentil a vous je débute en sas, et il faut bien trouver des solutions, mais cela me depasse:

c'est exactement ce que je vous ai donné ci-dessus : si vous voulez les tables reelles je ne pourais les apporter que demain, j'installerai sas chez moi des demain

table 1

Var(COMAS) frequence effectifs
mod debut 15 15
fin 20 20
hopital 30 30

VAR =variable MOD=modalité

table 2

Var(ADMISSION HOPITAL) freq effectifs
MOD ambroise paré 30 20
salpetrire 40 30

j'ai trente vraible par fichier et donc pour chaque variable j'ai une proc freq,
je veux reunir toutes les variables entre elles de tel sorte a avoir

COMA debut fin hopital ADMISSION HOPITAL ambroise paré salpetriere
frequ 1 5 20 30
effectif
si cela ne suffit pas j'essayerai de joindre les tables si j'arrive car il s'agit de tables sas et donc je ne crois pas pouvoir les mettre en piece jointe

merci encore pour vos efforts
cordialement,
Ameur
mamiche est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/05/2008, 10h44   #9
Membre Expert
 
Inscription : mars 2005
Messages : 1 028
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 1 028
Points : 1 278
Points : 1 278
Envoyer un message via Yahoo à bahraoui
Une partie du code pour transposer les tables.
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
 
DATA toto1;
format cle $10. frequence 5. effectif 5.;
input cle $ frequence effectif;
cards;
rean 10 30
toto 40 50
titi 100 300
tata 50 63
;
 
 
DATA toto2;
format cle $10. frequence 5. effectif 5.;
input cle $ frequence effectif;
cards;
rean 10 30
tutu 80 10
titi 1 50
tata 90 543
;
run;
 
%macro transposer_var(nb_tb);
%do i=1 %TO &nb_tb;
	proc sort DATA=toto&i.; BY cle;run;
	proc transpose DATA=toto&i. out=toto&i._tr;
	BY cle;
	run;
	proc sort DATA=toto&i._tr; BY _name_;run;
	proc transpose DATA=toto&i._tr out=toto&i._tr;
	id cle;
	BY _NAME_;
	run;
%end;
%mend;
%transposer_var(2);
bahraoui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/05/2008, 20h40   #10
Nouveau Membre du Club
 
Inscription : mai 2008
Messages : 45
Détails du profil
Informations forums :
Inscription : mai 2008
Messages : 45
Points : 32
Points : 32
merci pour ton soutien je ne te reponds que maintenant car j'ai pas le net,
j'ai essayé ton code dans ma boucle, mais le probleme c'est que il me genere les tableaux sans le nom de variable(il met nom de l'ancienne variable), la transposition se fait bien ? toi j'ai vu que ta variable etait la mêmepour les deux tables ID hors moi c'est pas le cas ? comment faire
merci encore pour ton soutien

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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
%macro test5(fichier,nb_tb);
 
DATA donnesN;
SET &fichier;
keep _NUMERIC_;
run;
 
DATA cara;
SET &fichier;
keep _CHARACTER_;
run;
 
DATA cara;
SET cara;
IF DATA=cara then do;
proc contents DATA=cara out=Descar;
run;
end;
 
     else do;
         proc means DATA= donnesN  n nmiss min Q1 median Q3 max mean std ; 
         var _ALL_;
         output out= work.quanti; 
         run;
		 end;
 
 
 
%let i= _N_;
DATA Descar;
SET  Descar;
call symput(compress("nomvar"||_N_),NAME);
varId=symget("nomvar"||LEFT(put(_N_,4.)));
/*call symput(compress("var"||_N_),varnum);
vaId=symget("var"||left(put(_N_,4.)));
run;/*;
 
 
/*%global num;
data _NULL_; 
if 0 then set Descar nobs=NAME;
call symput("num",left(put(NAME)));
stop;
run;/*;
 
/*%let nomb=_N_;*/;
/*data Des;
set Descar;
call symput(compress("var"||_N_,varnum);
vaId=symget("var"||left(put(_N_,4.)));
run;*/
run;
DATA Des;
SET  Descar;
call symput(compress("nomvarr"||_N_),VARNUM);
varId=symget("nomvarr"||LEFT(put(_N_,4.)));
run;
 
%LOCAL num;
 
DATA Des;
IF 0 then SET Des nobs=VARNUM;
call symput('num',LEFT(put(VARNUM,8.)));
stop;
run;
 
 
DATA cara;
SET  cara;
 
/*data _null_;
if 0 then set cara nobs=count;
call symput('num',left(put(count,8.)));
stop;
run;*/;
 
 
%do i=1 %TO # 
 
    proc freq DATA=cara ORDER=freq;
    TABLES &&nomvar&i/out=table&i;
DATA tabl&i;
SET  table&i;
IF _N_ le 10;
 
	%end;
%do i=1 %TO &nb_tb;
	proc sort DATA=tabl&i.; BY &&nomvar&i;run;
	proc transpose DATA=tabl&i. out=tabl&i._tr;
	BY &&nomvar&i;
	run;
	proc sort DATA=tabl&i._tr; BY _name_;run;
	proc transpose DATA=tabl&i._tr out=tabl&i._tr;
	id &&nomvar&i;
	BY _name_;
	run;
	/*proc sort DATA=tabl&i._tr; BY _name_;run;
	proc transpose DATA=tabl&i._tr out=toto&i._tr;
	id cle;
	BY _NAME_;
	run;*/
 
%end;
%mend;
%test5(exatraitPS,3);
mamiche est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/05/2008, 09h15   #11
Membre Expert
 
Inscription : mars 2005
Messages : 1 028
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 1 028
Points : 1 278
Points : 1 278
Envoyer un message via Yahoo à bahraoui
En ce qui concerne les noms des variables des tables en sorties de la proc transpose c'est l'option :
qui le contrôle tu peux la supprimer pour avoir des noms par défaut.
bahraoui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/05/2008, 15h40   #12
Nouveau Membre du Club
 
Inscription : mai 2008
Messages : 45
Détails du profil
Informations forums :
Inscription : mai 2008
Messages : 45
Points : 32
Points : 32
Bahraoui,
ton petit exemple fait bien la proc transpose, j'ai voulu faire un petit essai en enlevant l'argument de ID; et donc j'ai rien mi a sa suite, il ne m'a pas affiché la variable cle par defaut !
il affiche nom de l'ancienne variable !

c'est exactement pareil sur mes tables, en sortie de la proc transpose il me met nom de l'ancienne variable !
et en mettant cle a la suite de by il ne reconnait pas dutout ça car cle n'existe pas pour lui dans mes tables, la proc sort je l'ai faite en prenant comme identifiant le nom de ma variable de chaque table!

est ce qu'il ne faudrait peut etre pas faire un rename !
merci encore
mamiche est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/05/2008, 15h43   #13
Membre Expert
 
Inscription : mars 2005
Messages : 1 028
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 1 028
Points : 1 278
Points : 1 278
Envoyer un message via Yahoo à bahraoui
Pour moi cle represente la variable var, comme dans l'exemple ci-dessous

Var(COMAS) frequence effectifs
mod debut 15 15
fin 20 20
hopital 30 30
bahraoui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/05/2008, 16h04   #14
Nouveau Membre du Club
 
Inscription : mai 2008
Messages : 45
Détails du profil
Informations forums :
Inscription : mai 2008
Messages : 45
Points : 32
Points : 32
oui c'est tout a fait ça !
je l'ai remplacé par ma macro variable qui contenait touts les noms des variables de chaque table !
le probleme c'estque mon tableau de sortie transpose bien sauf que a la sortie
ma premeiere colonne m'affiche

(nom de l'ancienne variable) debut fin hopital
(acount)
(percent)


les modalités sont bien transposées sauf que j'aurais souhaité avoir a la place de (nom de l'ancienne variable) = coma et (acount) = effectif
(percent)=pourcentage
MERCI
mamiche est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/05/2008, 16h12   #15
Membre Expert
 
Inscription : mars 2005
Messages : 1 028
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 1 028
Points : 1 278
Points : 1 278
Envoyer un message via Yahoo à bahraoui
Il va falloir les renommer, moi je n'avais pas ce problème puisque effectif et frequence sont les noms de mes variables voir l'exemple ci-dessus.
Soit tu les renommes après le transpose (if nom_var ='acount' then nom_var='effectif';...) ou avant (en utilisant un rename)
bahraoui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/05/2008, 16h33   #16
Nouveau Membre du Club
 
Inscription : mai 2008
Messages : 45
Détails du profil
Informations forums :
Inscription : mai 2008
Messages : 45
Points : 32
Points : 32
ben oui moi aussi effectif et frequence sont bien les noms de mes variables;
dans la petite application que tu m'as envoyé il se passe exactement la meme chose après transposition sur la table de sortie finale le nom de variable n'est pas clé mais (nom de l'ancienne variable)

excuse moi mon niveau est un peu bas en sas
merci encore
mamiche est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/05/2008, 16h37   #17
Membre Expert
 
Inscription : mars 2005
Messages : 1 028
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 1 028
Points : 1 278
Points : 1 278
Envoyer un message via Yahoo à bahraoui
Citation:
Envoyé par mamiche Voir le message
oui c'est tout a fait ça !
je l'ai remplacé par ma macro variable qui contenait touts les noms des variables de chaque table !
le probleme c'estque mon tableau de sortie transpose bien sauf que a la sortie
ma premeiere colonne m'affiche

(nom de l'ancienne variable) debut fin hopital
(acount)
(percent)


les modalités sont bien transposées sauf que j'aurais souhaité avoir a la place de (nom de l'ancienne variable) = coma et (acount) = effectif
(percent)=pourcentage
MERCI
Je ne comprends pas très bien le problème avec les noms des variables.
bahraoui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/05/2008, 16h47   #18
Nouveau Membre du Club
 
Inscription : mai 2008
Messages : 45
Détails du profil
Informations forums :
Inscription : mai 2008
Messages : 45
Points : 32
Points : 32
en fait c'est le libellé de la variable qui change automatiquement, aulieu de me mettre le nom de ma variable qui s'appelle "coma" il m'est a la place comme nom "nom de l'ancienne variable"
ton ton application pour les deux tables la sortie après transpose ne m'est pas comme libellé de variable "cle" mais "nom de l'ancienne variable"

merci encore
mamiche est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/05/2008, 16h55   #19
Membre Expert
 
Inscription : mars 2005
Messages : 1 028
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 1 028
Points : 1 278
Points : 1 278
Envoyer un message via Yahoo à bahraoui
C'est la proc transpose qui crée cette variable, il va falloir faire un rename.

Code :
1
2
 
DATA tabl&i._tr; SET tabl&i._tr(RENAME=(_name_=&&nomvar&i));run;
Ajoute ce code après la derniere transpose.
bahraoui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/05/2008, 18h56   #20
Nouveau Membre du Club
 
Inscription : mai 2008
Messages : 45
Détails du profil
Informations forums :
Inscription : mai 2008
Messages : 45
Points : 32
Points : 32
merci encore pour ce soutien,


j'avais pensé a ça aussi, j'ai appliqué le script que tu m'as donné, ça ne marche toujours pas :

voici ce que me signale le journal

AVERTISSEMENT: 2 observations omises en raison de valeurs ID manquantes
mamiche est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 01h31.


 
 
 
 
Partenaires

Hébergement Web