|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Invité régulier
![]() Inscription : septembre 2008 Messages : 46 ![]() |
Bonjour,
J'ai plusieurs tables de la forme : ID VAR1 VAR2 1 d111 d211 1 d112 d212 1 d113 d213 2 d121 d221 2 d122 d222 C'est-à-dire, plusieurs lignes par individu ID. Je souhaite les transformer de sorte qu'il n'y ait plus qu'un individu ID par ligne: ID|VAR1_1|VAR1_2|VAR1_3|VAR2_1|VAR2_2|VAR2_3 1-|d111--|d112---|d113--|d211---|d212--|d213-- 2-|d121--|d122---|-------|d221---|d222--|------- J'ai commencé par créer des rangs logiques, pour répartir les données dans les Var1_1, Var1_2, Var1_3, mais les ex-aequo me posent problème. Ensuite je dois définir le nombre de lignes maximum par ID pour savoir combien d'occurences n je dois avoir par Variable (Var1_1, Var1_2, Var1_3, .... Var1_n) Je comptais, enfin, répartir pour chaque rang (1,2,3...n) les données dans les variables recréées (Var1_1, Var1_2, Var1_3, .... Var1_n). Je me demandais d'abord, s'il n'existait pas une fonction (ou un extrait de code) type sur SAS pour ce type de transformation. Sinon je reste bloquée aux ex-aequo, pour la génération des rangs. Merci. |
|
|
00
|
|
|
#2 |
![]() ![]() Samir SELMANEConsultant en Business Intelligence Inscription : février 2011 Messages : 1 006 ![]() |
ce n'est pas la proc transpose que tu recherches?
|
|
|
00
|
|
|
#3 | ||
|
Membre Expert
![]() ![]() Brice BeareParis Inscription : janvier 2011 Messages : 956 ![]() |
Bonjour,
Une solution à ton problème Code :
|
||
|
|
00
|
|
|
#4 |
|
Invité régulier
![]() Inscription : septembre 2008 Messages : 46 ![]() |
Désolée, ma mise en page était un peu ratée...
Tout d'abord s_a_m, la PROC TRANSPOSE seule me ferait : ID---|1---|1----|1---|2----|2 VAR1|d111|d112|d113|d121|d122 VAR2|d211|d212|d213|d221|d222 avec les variables qui basculent en ligne ce que je veux c'est bien : ID|VAR1_1|VAR1_2|VAR1_3|VAR2_1|VAR2_2|VAR2_3 1-|d111--|d112---|d113--|d211---|d212--|d213-- 2-|d121--|d122---|-------|d221---|d222--|------- où les informations d'un individu sur 3 lignes sont regroupées sur une seule ligne, mais en 3 variables Ensuite MEGAMIND2, ce que tu proposes donne : ID|var1-|var2|var3-|var4|var5|var6 1-|d211|d212|d213|d111|d112|d113 2-|d221|d222|d121|d122|----|----- Dans mon cas de figure, VAR1 et VAR2 ne sont pas regroupables. Je peux en avoir plusieurs de nature complètement différentes. Je veux garder la distinction entre Var1_n et Var2_n, et donc leurs répartitions. (cf ID=2) |
|
|
00
|
|
|
#5 |
|
Membre Expert
![]() ![]() Brice BeareParis Inscription : janvier 2011 Messages : 956 ![]() |
C'est pas ce que tu as posté initialement...
|
|
|
00
|
|
|
#6 | |||||
|
Membre éclairé
![]() statisticien Inscription : mai 2011 Messages : 212 ![]() |
Bonsoir
Citation:
Concernant ta question je te propose une solution qui répond à ta question me semble-t-il à l'exception de l'ordre des variables finales... Code :
Code :
Mais.... il y a sans doute (peut-être ?) plus simple. |
|||||
|
|
20
|
|
|
#7 |
|
Membre Expert
![]() ![]() Brice BeareParis Inscription : janvier 2011 Messages : 956 ![]() |
Beau gosse Jerome
|
|
|
00
|
|
|
#8 | ||
|
Expert Confirmé
![]() ![]() Olivier DecourtFormateur en informatique Inscription : avril 2008 Messages : 1 467 ![]() |
Pas sûr qu'il y ait plus simple que ta solution Jérôme.
S'il y a à la fois des variables numériques et d'autres de type caractère, il faudra les traiter séparément. Je propose Code :
|
||
|
|
10
|
|
|
#9 |
|
Invité régulier
![]() Inscription : septembre 2008 Messages : 46 ![]() |
Merci olivier.decourt ça me convient tout à fait.
Il va juste falloir que je me familiarise plus aux ARRAY et aux différentes formes de TRANSPOSE, pour en faire autant une prochaine fois ! J'ai ajouté un tri en fonction des variables clés, avant d'appliquer le compteur. Pour finir, auriez-vous une astuce pour remettre les variables dans le même ordre qu'à l'origine ? (avant les indices _1, _2, _3... et la séparation Num/Car) |
|
|
00
|
|
|
#10 |
|
Membre Expert
![]() ![]() Brice BeareParis Inscription : janvier 2011 Messages : 956 ![]() |
Tu peux dire MERCI à Jérome aussi.
Voici comment tu peux ordonner tes variables (les attribs fait le même boulot) data table2; retain var1 var2 ...; set table; run; |
|
|
00
|
|
|
#11 |
|
Invité régulier
![]() Inscription : septembre 2008 Messages : 46 ![]() |
Biensûr : merci jerome_pdv2.
C'est une logique de programmation intéressante aussi. Sinon y a-t-il moyen de récupérer l'ordre des variables directement à partir de la table d'origine, sans entrer manuellement toutes les variables à la fin ? Je complique toujours les choses, mais c'est que ce soit réutilisable pour différentes tables. |
|
|
00
|
|
|
#12 |
|
Membre Expert
![]() ![]() Brice BeareParis Inscription : janvier 2011 Messages : 956 ![]() |
Il faut passer pas une proc contents pour récuperer le nom de tes variables dans la table initiale, les stockés dans une macro liste puis l'appeler au moment opportun.
Adaptes ceci à ton cas: proc contents data=sashelp.class out=out; run; proc sort data=out; by varnum; run; proc sql; select name into: liste separated by " " from out; quit; %put liste=&liste.; data table2; retain &liste.; set sashelp.class; run; Désolé, les balises code ne marchent pas |
|
|
00
|
|
|
#13 | ||
|
Invité régulier
![]() Inscription : septembre 2008 Messages : 46 ![]() |
Merci MEGAMIND2.
Je vous transmet donc mon programme final : Code :
|
||
|
|
00
|
|
|
#14 | ||
![]() ![]() Samir SELMANEConsultant en Business Intelligence Inscription : février 2011 Messages : 1 006 ![]() |
autre méthode pour revenir au premier ordre des variables:
ici je crée la table test pour modifier l'ordre des variables de la table Sashelp.class ensuite je crée une table var_classe avec des variables de même ordre que la Sashalp.class; Code :
|
||
|
|
00
|
Copyright © 2000-2012 - www.developpez.com