Publié le :

Exemples : Fusion par correspondance de données

Ce code est également disponible en : Deutsch English Español
En attente de validation
La fusion par correspondance est une technique puissante pour combiner des jeux de données SAS©. Elle permet de joindre des observations de deux ou plusieurs jeux de données en fonction des valeurs d'une ou plusieurs variables communes (variables BY). Les jeux de données d'entrée doivent être triés ou indexés par les variables BY avant la fusion. Ce processus peut être comparé à une jointure interne (INNER JOIN) en SQL lorsque toutes les valeurs des variables BY correspondent et qu'il n'y a pas de doublons. SAS© conserve les valeurs de toutes les variables dans le vecteur de données du programme, même si la valeur est manquante ou non appariée. Lorsqu'une observation finale d'un groupe BY est lue dans un jeu de données, SAS© retient ses valeurs pour toutes les variables uniques à ce jeu de données jusqu'à ce que toutes les observations de ce groupe BY aient été lues dans tous les jeux de données. Le nombre total d'observations dans le jeu de données final est la somme du nombre maximal d'observations dans un groupe BY de l'un ou l'autre des jeux de données.
Analyse des données

Type : CREATION_INTERNE


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é !
1DATA animal;
2 INPUT common $ animal$;
3 DATALINES;
4a Ant
5b Bird
6c Cat
7d Dog
8e Eagle
9f Frog
10;
11RUN;
12 
13DATA plant;
14 INPUT common $ plant$;
15 DATALINES;
16a Apple
17b Banana
18c Coconut
19d Dewberry
20e Eggplant
21f Fig
22;
23RUN;
24 
25PROC SORT DATA=animal; BY common; RUN;
26PROC SORT DATA=plant; BY common; RUN;
27 
28DATA matchmerge;
29 MERGE animal plant;
30 BY common;
31RUN;
32PROC PRINT DATA=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é !
1DATA one;
2 INPUT ID state$;
3 DATALINES;
41 AZ
52 MA
63 WA
74 WI
8;
9RUN;
10 
11DATA many;
12 INPUT ID city $ state$;
13 DATALINES;
141 Phoenix Ariz
152 Boston Mass
162 Foxboro Mass
173 Olympia Mass
183 Seattle Wash
193 Spokane Wash
204 Madison Wis
214 Milwaukee Wis
224 Madison Wis
234 Hurley Wis
24;
25RUN;
26 
27PROC SORT DATA=one; BY ID; RUN;
28PROC SORT DATA=many; BY ID; RUN;
29 
30DATA three;
31 MERGE many one;
32 BY ID;
33RUN;
34PROC PRINT DATA=three noobs; RUN;
35title;
36 
37DATA solution;
38 MERGE many(drop=state) one;
39 BY ID;
40RUN;
41PROC PRINT DATA=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é !
1DATA animalDupes;
2 INPUT common $ animal1$;
3 DATALINES;
4a Ant
5a Ape
6b Bird
7c Cat
8d Dog
9e Eagle
10;
11RUN;
12 
13DATA plantDupes;
14 INPUT common $ plant1$;
15 DATALINES;
16a Apple
17b Banana
18c Coconut
19c Celery
20d Dewberry
21e Eggplant
22;
23RUN;
24 
25PROC SORT DATA=animalDupes; BY common; RUN;
26PROC SORT DATA=plantDupes; BY common; RUN;
27 
28DATA matchmerge;
29 MERGE animalDupes plantDupes;
30 BY common;
31RUN;
32PROC PRINT DATA=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é !
1DATA animalMissing;
2 INPUT common $ animal1$;
3 DATALINES;
4a Ant
5c Cat
6d Dog
7e Eagle
8;
9RUN;
10 
11DATA plantMissing2;
12 INPUT common $ plant$;
13 DATALINES;
14a Apple
15b Banana
16c Coconut
17e Eggplant
18f Fig
19;
20RUN;
21 
22PROC SORT DATA=animalMissing; BY common; RUN;
23PROC SORT DATA=plantMissing2; BY common; RUN;
24 
25DATA matchmerge;
26 MERGE animalMissing plantMissing2;
27 BY common;
28RUN;
29 
30PROC PRINT DATA=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é !
1DATA animalMissing;
2 INPUT common $ animal$;
3 DATALINES;
4a Ant
5c Cat
6d Dog
7e Eagle
8;
9RUN;
10 
11DATA plantMissing2;
12 INPUT common $ plant$;
13 DATALINES;
14a Apple
15b Banana
16c Coconut
17e Eggplant
18f Fig
19;
20RUN;
21 
22PROC SORT DATA=animalMissing; BY common; RUN;
23PROC SORT DATA=plantMissing2; BY common; RUN;
24 
25DATA matchmerge2;
26 MERGE animalMissing(in=i) plantMissing2(in=j);
27 BY common;
28 IF (i=1) and (j=1);
29RUN;
30PROC PRINT DATA=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é !
1DATA fruit;
2 INPUT ID $ fruit$;
3 DATALINES;
4a apple
5c apricot
6d banana
7e blueberry
8c cantaloupe
9c coconut
10c cherry
11c crabapple
12c cranberry
13;
14RUN;
15 
16DATA color;
17 INPUT ID $ color$;
18 DATALINES;
19a amber
20b brown
21b blue
22b black
23b beige
24b bronze
25c cocoa
26c cream
27;
28RUN;
29 
30PROC SORT DATA=fruit; BY ID; RUN;
31PROC SORT DATA=color; BY ID; RUN;
32 
33DATA merged;
34 MERGE fruit color;
35 BY id;
36RUN;
37 
38PROC PRINT DATA=merged;
39 title 'Merged by ID';
40RUN;
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é !
1DATA one;
2 INPUT ID age score;
3 DATALINES;
41 8 90
51 . 100
61 . 95
72 9 80
82 . 100
9;
10RUN;
11 
12DATA two;
13 INPUT ID name $ age;
14 DATALINES;
151 Sarah 11
162 John 10
17;
18RUN;
19 
20PROC SORT DATA=one; BY ID; RUN;
21PROC SORT DATA=two; BY ID; RUN;
22 
23DATA merge1;
24 MERGE one two;
25 BY id;
26RUN;
27PROC PRINT DATA=merge1; title 'Merged by ID'; RUN;
28 
29DATA 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;
36RUN;
37PROC PRINT DATA=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.
Informations de Copyright : Copyright © SAS Institute Inc. All Rights Reserved


Banner
Le Conseil de l'Expert
Expert
Stéphanie
Spécialiste Machine Learning et IA.
« 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. »