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 12/02/2011, 14h53   #1
Invité de passage
 
Inscription : octobre 2009
Messages : 10
Détails du profil
Informations forums :
Inscription : octobre 2009
Messages : 10
Points : 1
Points : 1
Par défaut Suppression de doublons et compilation de champs

bonjour,

Voici mon interrogation :
J'ai une table SAS que je dois dédoublonner par email ; jusque là, une proc sort nodupkey aurait pu suffire mais c'est en fait une table issue d'un set de plusieurs tables dont voici le contenu simplifié :
Table1 :
Email ; VAR1
xxx@yah.fr ; 1
yyy@hotm.fr ; 1
zzz@yah.fr ; 1

Table2 :
Email ; VAR2
www@hotm.fr ; 2
yyy@hotm.fr ; 2

Table3 :
Email ; VAR3
vvv@yah.fr ; 3
zzz@yah.fr ;3

Je concatène ces 3 tables, ce qui me donne une fois la table triée par email :
Email ; VAR1 ; VAR2 ; VAR3
vvv@yah.fr ; . ; . ; 3
www@hotm.fr ; . ; 2 ; .
xxx@yah.fr ; 1 ; . ; .
yyy@hotm.fr ; 1 ; . ; .
yyy@hotm.fr ; . ; 2 ; .
zzz@yah.fr ; 1 ; . ; .
zzz@yah.fr ; . ; . ; 3

Un dédoublonnage standard ferait :
Email ; VAR1 ; VAR2 ; VAR3
vvv@yah.fr ; . ; . ; 3
www@hotm.fr ; . ; 2 ; .
xxx@yah.fr ; 1 ; . ; .
yyy@hotm.fr ; 1 ; . ; .
zzz@yah.fr ; 1 ; . ; .

Or, je voudrais :
Email ; VAR1 ; VAR2 ; VAR3
vvv@yah.fr ; . ; . ; 3
www@hotm.fr ; . ; 2 ; .
xxx@yah.fr ; 1 ; . ; .
yyy@hotm.fr ; 1 ; 2 ; .
zzz@yah.fr ; 1 ; . ; 3

c'est à dire, garder un seul email tout en conservant les variables, en les agrégeant ; je crois savoir qu'une Proc transpose pourrait m'aider ... avez-vous une solution me permettant de résoudre mon problème ?

Merci d'avance.
Baffien est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/02/2011, 18h24   #2
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 823
Points : 2 823
Bonjour.
Je pense qu'une proc MEANS (avec une somme) de tes variables numériques, et CLASS les adresses mail, te fournira le résultat voulu.
Sinon, une étape DATA avec un SET BY, des RETAIN et des FIRST LAST permettra aussi d'arriver au résultat.
Bon courage.
Olivier
olivier.decourt est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/02/2011, 18h29   #3
Membre habitué
 
Sébastien Ringuedé
Inscription : janvier 2011
Messages : 61
Détails du profil
Informations personnelles :
Nom : Sébastien Ringuedé
Localisation : France, Loiret (Centre)

Informations forums :
Inscription : janvier 2011
Messages : 61
Points : 114
Points : 114
pas besoin de PROC TRANSPOSE, une petite étape data (adaptée au fait que les variables X1-X3 sont toutes numériques) et hop...

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
 
DATA test;
INFILE cards dlm=";";
input email :$15. x1 x2 x3 ;
cards4;
vvv@yah.fr ; . ; . ; 3
www@hotm.fr ; . ; 2 ; .
xxx@yah.fr ; 1 ; . ; .
yyy@hotm.fr ; 1 ; . ; .
yyy@hotm.fr ; . ; 2 ; .
zzz@yah.fr ; 1 ; . ; .
zzz@yah.fr ; . ; . ; 3
;;;;
 
proc sort DATA=test;
BY email;
run;
 
DATA test2(keep=email a:);
SET test;
BY email;
retain a1 a2 a3;
array a{3};
array x{3};
IF first.email then do;
   do i=1 TO dim(a);
      a{i}=x{i};
   end;
end;
else do;
   do i=1 TO dim(a);
      IF a{i} ne . then a{i}=x{i};
   end;
end;
IF last.email;
run;
 
proc print;run;
Cordialement

Sébastien Ringuedé
z6c3po est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/02/2011, 19h21   #4
Invité de passage
 
Inscription : octobre 2009
Messages : 10
Détails du profil
Informations forums :
Inscription : octobre 2009
Messages : 10
Points : 1
Points : 1
Merci Olivier et Sébastien.
Je vais appliquer ce programme demain et l'adapter à mes variables ; le seul souci, c'est que j'ai à la fois du numérique et du caractère ...

Merci encore, bonne soirée !
Baffien est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/02/2011, 19h50   #5
Membre habitué
 
Sébastien Ringuedé
Inscription : janvier 2011
Messages : 61
Détails du profil
Informations personnelles :
Nom : Sébastien Ringuedé
Localisation : France, Loiret (Centre)

Informations forums :
Inscription : janvier 2011
Messages : 61
Points : 114
Points : 114
Citation:
Envoyé par Baffien Voir le message
Merci Olivier et Sébastien.
Je vais appliquer ce programme demain et l'adapter à mes variables ; le seul souci, c'est que j'ai à la fois du numérique et du caractère ...

Merci encore, bonne soirée !
alors il faut créer non pas deux array mais quatre, deux pour les variables numériques (une "avant", une "après") et deux pour les caractères (email sera dedans mais ce n'est pas bien grave).

pour spécifier les dimensions des array "après" (parce qu'il ne faudra bien...), passe par un data _null_ du style :

Code :
1
2
3
4
5
6
7
 
DATA _null_;
SET test;
array x{*} _numeric_;
z=dim(a);
call symput ('toto',z);
;
(dim fait partie des fonctions qu'on ne peut pas utiliser avec CALL SYMPUT ce qui explique le passage par Z)

Cordialement

Sébastien Ringuedé
z6c3po 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 10h01.


 
 
 
 
Partenaires

Hébergement Web