Bonjour,
Je cherche à regrouper des observations de 2 tables pour lesquelles une valeur de variable est identique mais je ne veux pas que ces observations soient mises l'une à coté de l'autre mais l'une en dessous de l'autre.
Le but final est de regrouper les noms très proches susceptibles d'être des doublons (vérification manuelle finale).
Voici mon code:
1ère étape: renommer variables pour le dataset C1
2ème étape: renommer variables pour le dataset C2
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 data C1; set C; identC1=trim(left(nom))!!" "!!trim(left(prenom)); rename idc=idcC1; rename dnaissj=dnaissjC1; rename dnaissm=dnaissmC1; rename dnaissa=dnaissaC1; run;
3ème étape: calculer distance entre chaque nom de C1 et chaque nom de C2 et garder la plus petite distance différente de 0. Rq: il peut y avoir des ex-aequo
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 data C2; set C; identC2=trim(left(nom))!!" "!!trim(left(prenom)); rename idc=idcC2; rename dnaissj=dnaissjC2; rename dnaissm=dnaissmC2; rename dnaissa=dnaissaC2; run;
4ème étape: mettre un identifiant groupe pour chaque observation où on a le meme identC1
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 proc sql ; CREATE TABLE work.CD AS SELECT C1.*, C2.*, COMPLEV(C1.identC1, C.identC2) AS distance FROM C1, C2 GROUP BY C1.identC1 HAVING distance^= 0 ; QUIT ; proc sql ; CREATE TABLE work.CD2 AS SELECT CD.*, MIN(distance) AS minimum FROM CD GROUP BY CD.identC1 HAVING distance = minimum ; QUIT ;
5ème étape: séparation en 2 datasets
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 proc sort data=CD2; by IdentC1; run; data CD3; set CD2; by IdentC1; retain idgp 0; if first.identC1 then idgp=idgp +1; run;
6ème étape: renommer les variables des 2 datasets pour avoir les memes noms
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 data CD3_1 (keep = idcC1 identC1 dnaissjC1 dnaissmC1 dnaissaC1 idgp); set CD3; run; proc sql; create table CD4_1 as select distinct idcC1,* from CD3_1; quit; data CD3_2 (keep = idcC2 identC2 dnaissjC2 dnaissmC2 dnaissaC2 idgp); set CD3; run; proc sql; create table CD4_2 as select distinct idcC2,* from CD3_2; quit;
7ème étape: assemblage des datasets par idgp - ne marche pas car j'obtiens pleins de lignes avec le meme idgp (avec ou sans le group by)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 data CD5_1; set CD4_1; rename identC1=ident; rename idcC1=idc; rename dnaissjC1=dnaissj; rename dnaissmC1=dnaissm; rename dnaissaC1=dnaissa; run; data CD5_2; set CD4_2; rename identC2=ident; rename idcC2=idc; rename dnaissjC2=dnaissj; rename dnaissmC2=dnaissm; rename dnaissaC2=dnaissa; run;
je voudrais:
idcC1 idgpA
idcC2 idgpA
idcC3 idgpA
idcC4 idgpB
idcC5 idgpB
idcC6 idgpC
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 proc sql ; CREATE TABLE work.CD6 AS SELECT CD5_1.*, CD5_2.* FROM CD5_1, CD5_2 GROUP BY idgp ; QUIT ;
Merci de votre aide.
Partager