SAS Merge with Repeat by .. note vs PROC SQL
La fusion de deux tables sous SAS 9:
L'utilisation de la fonction merge dans SAS provoque souvent ce type de note :
En francais:
Note: L'instruction MERGE comporte plus d'une table avec des répétitions des valeurs BY.
En Anglais :
NOTE: MERGE statement has more than one data set with repeats of BY values.
Ce type de note, même s'il n'est pas signalé comme une erreur alerte le programmeur sur un problème sur les données. L'exemple ci dessous illustre ce type de problème et sa résolution.
J'ai deux tables: 1 première table avec deux variables catégorielles time et val et une seconde table contenant la variable time et la variable mesure; Ci dessous le programme pour créer les tables :
*************;
data fichier1;
input time $ val $;
cards;
t1 cat1
t2 cat2
t3 cat3
t1 cat11
t2 cat21
t3 cat31
;
run;
data fichier2;
input time $ mesure ;
cards;
t1 1
t2 2
t3 3
t1 4
t2 5
t3 6
;
run;
***************
je désire obtenir un nouveau fichier3 avec la fusion du fichier1 et du fichie2. L'utilisation de la procédure merge se fait de la manière suivante:
*1. tri des fichiers sur la variable time ;
proc sort data=fichier1;by time;run;
proc sort data=fichier2;by time;run;
*2. Fusion des deux fichiers par la procédure merge;
data fichier3;
merge fichier2 fichier1;
by time;
run;
* Une impression du résultat est le suivant:;
proc print ; run;
**********Résultats*********************;
Obs time mesure val
1 t1 1 cat1
2 t1 4 cat11
3 t2 2 cat2
4 t2 5 cat21
5 t3 3 cat3
6 t3 6 cat31
***************************;
Au vu du résultat, je me rends compte qu'au lieu de 12 combinaisons, la procédure merge me donne 6; par exemple, je ne vois pas la ligne t1 1 cat1 4;
Une des solutions élégantes d'un tel problème réside dans l'utilisation de la procédure SQL de la manière suivante;
***;
proc sql;
create table fichier3
as select a.time, a.val, b.mesure
from fichier1 as a, fichier2 as b
where a.time=b.time;quit;
proc print ; run;
****;
Le résultat de la fonction print est le suivant :
Obs time val mesure
1 t1 cat1 1
2 t1 cat1 4
3 t1 cat11 1
4 t1 cat11 4
5 t2 cat2 2
6 t2 cat2 5
7 t2 cat21 2
8 t2 cat21 5
9 t3 cat3 3
10 t3 cat3 6
11 t3 cat31 3
12 t3 cat31 6
Leçons : Un des avantages de la procédure SQL est qu'il n'exige pas de tri avant de lancer la procédure comme beaucoup de procédures et en plus il a très peu d'options .
L'utilisation de la fonction merge dans SAS provoque souvent ce type de note :
En francais:
Note: L'instruction MERGE comporte plus d'une table avec des répétitions des valeurs BY.
En Anglais :
NOTE: MERGE statement has more than one data set with repeats of BY values.
Ce type de note, même s'il n'est pas signalé comme une erreur alerte le programmeur sur un problème sur les données. L'exemple ci dessous illustre ce type de problème et sa résolution.
J'ai deux tables: 1 première table avec deux variables catégorielles time et val et une seconde table contenant la variable time et la variable mesure; Ci dessous le programme pour créer les tables :
*************;
data fichier1;
input time $ val $;
cards;
t1 cat1
t2 cat2
t3 cat3
t1 cat11
t2 cat21
t3 cat31
;
run;
data fichier2;
input time $ mesure ;
cards;
t1 1
t2 2
t3 3
t1 4
t2 5
t3 6
;
run;
***************
je désire obtenir un nouveau fichier3 avec la fusion du fichier1 et du fichie2. L'utilisation de la procédure merge se fait de la manière suivante:
*1. tri des fichiers sur la variable time ;
proc sort data=fichier1;by time;run;
proc sort data=fichier2;by time;run;
*2. Fusion des deux fichiers par la procédure merge;
data fichier3;
merge fichier2 fichier1;
by time;
run;
* Une impression du résultat est le suivant:;
proc print ; run;
**********Résultats*********************;
Obs time mesure val
1 t1 1 cat1
2 t1 4 cat11
3 t2 2 cat2
4 t2 5 cat21
5 t3 3 cat3
6 t3 6 cat31
***************************;
Au vu du résultat, je me rends compte qu'au lieu de 12 combinaisons, la procédure merge me donne 6; par exemple, je ne vois pas la ligne t1 1 cat1 4;
Une des solutions élégantes d'un tel problème réside dans l'utilisation de la procédure SQL de la manière suivante;
***;
proc sql;
create table fichier3
as select a.time, a.val, b.mesure
from fichier1 as a, fichier2 as b
where a.time=b.time;quit;
proc print ; run;
****;
Le résultat de la fonction print est le suivant :
Obs time val mesure
1 t1 cat1 1
2 t1 cat1 4
3 t1 cat11 1
4 t1 cat11 4
5 t2 cat2 2
6 t2 cat2 5
7 t2 cat21 2
8 t2 cat21 5
9 t3 cat3 3
10 t3 cat3 6
11 t3 cat31 3
12 t3 cat31 6
Leçons : Un des avantages de la procédure SQL est qu'il n'exige pas de tri avant de lancer la procédure comme beaucoup de procédures et en plus il a très peu d'options .
Commentaires