Les exemples utilisent des données générées (datalines) ou SASHELP.
1 Bloc de code
DATA STEP / PROC SORT Data
Explication : Cet exemple illustre une fusion par correspondance simple où l'instruction MERGE est utilisée avec l'instruction BY pour joindre deux jeux de données ('animal' et 'plant') basés sur la variable commune 'common'. C'est une fusion un-à-un car il n'y a pas de valeurs dupliquées pour la variable BY dans aucun des jeux de données d'entrée. Les jeux de données sont d'abord triés par 'common' avant la fusion.
Copié !
data animal;
input common $ animal$;
datalines;
a Ant
b Bird
c Cat
d Dog
e Eagle
f Frog
;
run;
data plant;
input common $ plant$;
datalines;
a Apple
b Banana
c Coconut
d Dewberry
e Eggplant
f Fig
;
run;
proc sort data=animal; by common; run;
proc sort data=plant; by common; run;
data matchmerge;
merge animal plant;
by common;
run;
proc print data=matchmerge; run;
1
DATA animal;
2
INPUT common $ animal$;
3
DATALINES;
4
a Ant
5
b Bird
6
c Cat
7
d Dog
8
e Eagle
9
f Frog
10
;
11
RUN;
12
13
DATA plant;
14
INPUT common $ plant$;
15
DATALINES;
16
a Apple
17
b Banana
18
c Coconut
19
d Dewberry
20
e Eggplant
21
f Fig
22
;
23
RUN;
24
25
PROC SORTDATA=animal; BY common; RUN;
26
PROC SORTDATA=plant; BY common; RUN;
27
28
DATA matchmerge;
29
MERGE animal plant;
30
BY common;
31
RUN;
32
PROC PRINTDATA=matchmerge; RUN;
2 Bloc de code
DATA STEP / PROC PRINT Data
Explication : Cet exemple montre une fusion un-à-plusieurs. Les jeux de données 'one' et 'many' contiennent les variables 'ID' et 'state'. 'ID' est la variable BY. Lorsque 'state' n'est pas une variable BY, sa valeur du jeu de données 'one' (listé en deuxième) écrase la première valeur du jeu de données 'many' pour chaque groupe BY, mais pas les suivantes. Pour remplacer toutes les valeurs de 'state' dans le groupe BY, la variable 'state' du jeu de données 'many' doit être supprimée ou renommée avant la fusion, comme illustré dans le deuxième bloc de code ('data solution').
Copié !
data one;
input ID state$;
datalines;
1 AZ
2 MA
3 WA
4 WI
;
run;
data many;
input ID city $ state$;
datalines;
1 Phoenix Ariz
2 Boston Mass
2 Foxboro Mass
3 Olympia Mass
3 Seattle Wash
3 Spokane Wash
4 Madison Wis
4 Milwaukee Wis
4 Madison Wis
4 Hurley Wis
;
run;
proc sort data=one; by ID; run;
proc sort data=many; by ID; run;
data three;
merge many one;
by ID;
run;
proc print data=three noobs; run;
title;
data solution;
merge many(drop=state) one;
by ID;
run;
proc print data=solution noobs; run;
1
DATA one;
2
INPUT ID state$;
3
DATALINES;
4
1 AZ
5
2 MA
6
3 WA
7
4 WI
8
;
9
RUN;
10
11
DATA many;
12
INPUT ID city $ state$;
13
DATALINES;
14
1 Phoenix Ariz
15
2 Boston Mass
16
2 Foxboro Mass
17
3 Olympia Mass
18
3 Seattle Wash
19
3 Spokane Wash
20
4 Madison Wis
21
4 Milwaukee Wis
22
4 Madison Wis
23
4 Hurley Wis
24
;
25
RUN;
26
27
PROC SORTDATA=one; BY ID; RUN;
28
PROC SORTDATA=many; BY ID; RUN;
29
30
DATA three;
31
MERGE many one;
32
BY ID;
33
RUN;
34
PROC PRINTDATA=three noobs; RUN;
35
title;
36
37
DATA solution;
38
MERGE many(drop=state) one;
39
BY ID;
40
RUN;
41
PROC PRINTDATA=solution noobs; RUN;
3 Bloc de code
DATA STEP / PROC SORT Data
Explication : Cet exemple illustre une fusion plusieurs-à-un lorsque les jeux de données d'entrée 'animalDupes' et 'plantDupes' contiennent des valeurs dupliquées pour la variable BY 'common'. SAS combine toutes les observations de chaque groupe BY, en retenant les valeurs de toutes les variables. Les jeux de données sont triés par 'common' avant la fusion.
Copié !
data animalDupes;
input common $ animal1$;
datalines;
a Ant
a Ape
b Bird
c Cat
d Dog
e Eagle
;
run;
data plantDupes;
input common $ plant1$;
datalines;
a Apple
b Banana
c Coconut
c Celery
d Dewberry
e Eggplant
;
run;
proc sort data=animalDupes; by common; run;
proc sort data=plantDupes; by common; run;
data matchmerge;
merge animalDupes plantDupes;
by common;
run;
proc print data=matchmerge; run;
1
DATA animalDupes;
2
INPUT common $ animal1$;
3
DATALINES;
4
a Ant
5
a Ape
6
b Bird
7
c Cat
8
d Dog
9
e Eagle
10
;
11
RUN;
12
13
DATA plantDupes;
14
INPUT common $ plant1$;
15
DATALINES;
16
a Apple
17
b Banana
18
c Coconut
19
c Celery
20
d Dewberry
21
e Eggplant
22
;
23
RUN;
24
25
PROC SORTDATA=animalDupes; BY common; RUN;
26
PROC SORTDATA=plantDupes; BY common; RUN;
27
28
DATA matchmerge;
29
MERGE animalDupes plantDupes;
30
BY common;
31
RUN;
32
PROC PRINTDATA=matchmerge; RUN;
4 Bloc de code
DATA STEP / PROC SORT Data
Explication : Cet exemple montre la fusion de deux jeux de données ('animalMissing' et 'plantMissing2') qui ont des valeurs différentes pour leur variable BY commune 'common', entraînant des observations non appariées. SAS retient les valeurs de toutes les variables des deux jeux de données dans le résultat final, même si la valeur est manquante dans l'un des jeux de données. Les jeux de données sont triés par 'common' avant la fusion.
Copié !
data animalMissing;
input common $ animal1$;
datalines;
a Ant
c Cat
d Dog
e Eagle
;
run;
data plantMissing2;
input common $ plant$;
datalines;
a Apple
b Banana
c Coconut
e Eggplant
f Fig
;
run;
proc sort data=animalMissing; by common; run;
proc sort data=plantMissing2; by common; run;
data matchmerge;
merge animalMissing plantMissing2;
by common;
run;
proc print data=matchmerge; run;
1
DATA animalMissing;
2
INPUT common $ animal1$;
3
DATALINES;
4
a Ant
5
c Cat
6
d Dog
7
e Eagle
8
;
9
RUN;
10
11
DATA plantMissing2;
12
INPUT common $ plant$;
13
DATALINES;
14
a Apple
15
b Banana
16
c Coconut
17
e Eggplant
18
f Fig
19
;
20
RUN;
21
22
PROC SORTDATA=animalMissing; BY common; RUN;
23
PROC SORTDATA=plantMissing2; BY common; RUN;
24
25
DATA matchmerge;
26
MERGE animalMissing plantMissing2;
27
BY common;
28
RUN;
29
30
PROC PRINTDATA=matchmerge; RUN;
5 Bloc de code
DATA STEP / PROC SORT Data
Explication : Cet exemple est similaire au précédent, mais il utilise l'option de jeu de données IN= pour supprimer les observations non appariées du jeu de données de sortie. La variable IN= est une variable booléenne qui prend la valeur 1 si le jeu de données contribue à l'observation courante et 0 sinon. L'instruction IF (i=1) and (j=1) s'assure que seules les observations présentes dans les deux jeux de données (appariées) sont incluses dans le résultat.
Copié !
data animalMissing;
input common $ animal$;
datalines;
a Ant
c Cat
d Dog
e Eagle
;
run;
data plantMissing2;
input common $ plant$;
datalines;
a Apple
b Banana
c Coconut
e Eggplant
f Fig
;
run;
proc sort data=animalMissing; by common; run;
proc sort data=plantMissing2; by common; run;
data matchmerge2;
merge animalMissing(in=i) plantMissing2(in=j);
by common;
if (i=1) and (j=1);
run;
proc print data=matchmerge2; run;
1
DATA animalMissing;
2
INPUT common $ animal$;
3
DATALINES;
4
a Ant
5
c Cat
6
d Dog
7
e Eagle
8
;
9
RUN;
10
11
DATA plantMissing2;
12
INPUT common $ plant$;
13
DATALINES;
14
a Apple
15
b Banana
16
c Coconut
17
e Eggplant
18
f Fig
19
;
20
RUN;
21
22
PROC SORTDATA=animalMissing; BY common; RUN;
23
PROC SORTDATA=plantMissing2; BY common; RUN;
24
25
DATA matchmerge2;
26
MERGE animalMissing(in=i) plantMissing2(in=j);
27
BY common;
28
IF (i=1) and (j=1);
29
RUN;
30
PROC PRINTDATA=matchmerge2; RUN;
6 Bloc de code
DATA STEP / PROC PRINT Data
Explication : Cet exemple montre une fusion par correspondance lorsque des valeurs dupliquées de la variable BY 'ID' existent dans les deux jeux de données ('fruit' et 'color'). Les jeux de données sont d'abord triés par 'ID'. Lors de la fusion, la valeur de la variable 'color' du jeu de données 'color' (listé en deuxième) écrase la valeur dans le PDV pour la première observation du groupe BY. Les valeurs subséquentes du groupe BY sont ensuite remplies avec cette valeur 'color' jusqu'à ce que le groupe BY change. Cela est dû au fait que les variables ne se réinitialisent pas à des valeurs manquantes tant que le groupe BY ne change pas.
Copié !
data fruit;
input ID $ fruit$;
datalines;
a apple
c apricot
d banana
e blueberry
c cantaloupe
c coconut
c cherry
c crabapple
c cranberry
;
run;
data color;
input ID $ color$;
datalines;
a amber
b brown
b blue
b black
b beige
b bronze
c cocoa
c cream
;
run;
proc sort data=fruit; by ID; run;
proc sort data=color; by ID; run;
data merged;
merge fruit color;
by id;
run;
proc print data=merged;
title 'Merged by ID';
run;
1
DATA fruit;
2
INPUT ID $ fruit$;
3
DATALINES;
4
a apple
5
c apricot
6
d banana
7
e blueberry
8
c cantaloupe
9
c coconut
10
c cherry
11
c crabapple
12
c cranberry
13
;
14
RUN;
15
16
DATA color;
17
INPUT ID $ color$;
18
DATALINES;
19
a amber
20
b brown
21
b blue
22
b black
23
b beige
24
b bronze
25
c cocoa
26
c cream
27
;
28
RUN;
29
30
PROC SORTDATA=fruit; BY ID; RUN;
31
PROC SORTDATA=color; BY ID; RUN;
32
33
DATA merged;
34
MERGE fruit color;
35
BY id;
36
RUN;
37
38
PROC PRINTDATA=merged;
39
title 'Merged by ID';
40
RUN;
7 Bloc de code
DATA STEP / PROC PRINT Data
Explication : Cet exemple montre comment gérer les valeurs manquantes lors d'une fusion un-à-plusieurs avec des variables communes. Initialement, une fusion simple des jeux de données 'one' et 'two' (qui contiennent des valeurs manquantes pour 'age' dans 'one') entraîne des valeurs manquantes pour 'age' dans le jeu de données fusionné. Pour corriger cela, le deuxième bloc de code utilise une variable temporaire ('temp_age') et l'instruction RETAIN. Lors du premier enregistrement d'un groupe BY, 'temp_age' est réinitialisé à une valeur manquante. Si 'age' est manquant, il est remplacé par 'temp_age'. Sinon, 'temp_age' est mis à jour avec la valeur non manquante de 'age', garantissant que la dernière valeur non manquante est propagée dans le groupe BY.
Copié !
data one;
input ID age score;
datalines;
1 8 90
1 . 100
1 . 95
2 9 80
2 . 100
;
run;
data two;
input ID name $ age;
datalines;
1 Sarah 11
2 John 10
;
run;
proc sort data=one; by ID; run;
proc sort data=two; by ID; run;
data merge1;
merge one two;
by id;
run;
proc print data=merge1; title 'Merged by ID'; run;
data merge2 (drop=temp_age);
merge one two;
by id;
retain temp_age;
if first.id then temp_age = .;
if age = . then age = temp_age;
else temp_age = age;
run;
proc print data=merge2; title 'Merged by ID with Age Retained'; run;
1
DATA one;
2
INPUT ID age score;
3
DATALINES;
4
1890
5
1 . 100
6
1 . 95
7
2980
8
2 . 100
9
;
10
RUN;
11
12
DATA two;
13
INPUT ID name $ age;
14
DATALINES;
15
1 Sarah 11
16
2 John 10
17
;
18
RUN;
19
20
PROC SORTDATA=one; BY ID; RUN;
21
PROC SORTDATA=two; BY ID; RUN;
22
23
DATA merge1;
24
MERGE one two;
25
BY id;
26
RUN;
27
PROC PRINTDATA=merge1; title 'Merged by ID'; RUN;
28
29
DATA merge2 (drop=temp_age);
30
MERGE one two;
31
BY id;
32
retain temp_age;
33
IF first.id THEN temp_age = .;
34
IF age = . THEN age = temp_age;
35
ELSE temp_age = age;
36
RUN;
37
PROC PRINTDATA=merge2; title 'Merged by ID with Age Retained'; RUN;
Ce matériel est fourni "tel quel" par We Are Cas. Il n'y a aucune garantie, expresse ou implicite, quant à la qualité marchande ou à l'adéquation à un usage particulier concernant le matériel ou le code contenu dans les présentes. We Are Cas n'est pas responsable des erreurs dans ce matériel tel qu'il existe maintenant ou existera, et We Are Cas ne fournit pas de support technique pour celui-ci.
« Pour éviter les écrasements accidentels de variables portant le même nom (mais contenant des informations différentes), utilisez systématiquement l'option RENAME= ou DROP= sur vos tables d'entrée au sein de l'instruction MERGE. Cela clarifie votre code et garantit qu'aucune donnée n'est remplacée silencieusement pendant la fusion. »
SAS et tous les autres noms de produits ou de services de SAS Institute Inc. sont des marques déposées ou des marques de commerce de SAS Institute Inc. aux États-Unis et dans d'autres pays. ® indique un enregistrement aux États-Unis. WeAreCAS est un site communautaire indépendant et n'est pas affilié à SAS Institute Inc.
Ce site utilise des cookies techniques et analytiques pour améliorer votre expérience.
En savoir plus.