h1

Sauvegarder le résultat d’une comparaison de deux data sets dans un data set avec PROC COMPARE

janvier 7, 2010

Fréquemment, le programmeur est amené à comparer deux datasets. Deux méthodes s’offrent à lui : un merge accompagné de l’option IN ou la procédure PROC COMPARE. Voici une illustration de PROC COMPARE.

1. Préparer les données

Pour illustrer la procédure PROC COMPARE, il nous faut deux data sets. Le premier s’intitule CLASS et est sauvegardé dans la bibliothèque SASHELP (SASHELP.CLASS). Le second s’appelle également CLASS. C’est un dérivé du premier. Il est savegardé dans la bibliothèque temporarire WORK (WORK.CLASS).

Voici comment est créé le second data set à partir du premier :

  • Une observation de la variable NAME passe de Alice à Alica
  • Une observation de la variable AGE prend la valeur 16 quand le nom est Robert
  • Une observation est ajoutée. La variable NAME prend la valeur Extra. Les autres variables ont des valeurs manquantes.

data class;
set sashelp.class;
if name=‘Alice’ then name=‘Alica’;
if name=‘Robert’ then age=16;
output;
if _N_=1 then
do
;
name=‘Extra’;
output;
end;
run;

2. L’importance d’avoir des données triées

Dans la procédure PROC COMPARE utiliser par la suite, j’ai choisi d’utiliser l’instruction ID. Cette instruction requiert que les données soient triées préalablement. En effet, si ce n’est pas le cas un message d’erreur comme celui-ci apparaît :

proc sort data=class;
by name;
run;

3. Enregistrer le résultat de la différence dans un data set

Ce qui m’intéresse ici est de sauvegarder le résultat de la comparaison dans un data set et non de l’afficher dans la sortie .txt. Pour ce faire, l’option OUT= précise le nom du data set qui sauvergardera les résultat et l’option NOPRINT stoppe l’affichage des résultats dans la log.

Quatres options précisent le contenu du résultat :

  • OUTNOEQUAL : seules les observations où une différence est détectée seront sauvegardés
  • OUTBASE : une ligne contiendra les lignes d’observation du fichier de base défini dans l’option DATA=
  • OUTCOMP : une ligne contiendra les lignes d’observation du fichier de comparaison indiqué avec l’option COMPARE=
  • OUTDIF: une ligne annotera les valeurs présentant des différences

En outre, l’instruction ID me permet de lister ma/mes variables que je considère comme des variables clés et d’en tenir compte dans la comparaison. J’ai choisi de comparer les observations seulement si elles ont la même valeur dans la variable NAME. Si une valeur de NAME n’est présente que dans un des deux fichiers, cette inconsistence sera également enregistrée.

proc compare data=sashelp.class compare=class
out=diff_class outnoequal outbase outcomp outdif
noprint;
id name;
run;

4. A quoi ressemble le fichier contenant les différences

Voici le contenu du fichier DIFF_CLASS répertoriant les les différences entre le fichier SASHELP.CLASS et le fichier WORK.CLASS.

options ls=max nocenter;
proc print data=diff_class width=min;
format _all_;
run;

Deux points sont à noter ici.

Tout d’abord, on a trois cas où la valeur de la variable définie dans ID est présente dans un seul des deux fichiers. Dans chacun de ces trois cas, le fichier DIFF_CLASS enregistre une seule ligne d’observations.

  • NAME=Alica est seulement présent dans le fichier de comparaison (WORK.CLASS)
  • NAME=Alice est seulement présent dans le fichier de base (SASHELP.CLASS)
  • COMPARE=Extra est seulement présent dans le fichier de comparaison (WORK.CLASS)

Puis, on a un cas où NAME=Robert est présent dans les deux fichiers mais avec des différences dans les autres variables. Une troisième ligne DIF précise où les différences et les égalités se situent.

  • Valeurs numériques
    • E pour égalités : c’est le cas des variables HEIGHT et WEIGHT
    • un nombre qui mesure la différence :  l’âge dans WORK.CLASS et de 4 plus grand que celui dans le fichier de base SASHELP.CLASS
  • Valeurs caractères
    • Un point pour des égalités : la variable SEX
    • Des xxx pour une différence : le cas ne se présente pas dans notre exemple

5. Un fichier est créé même si aucune différence n’est enregistrée

Il n’existe pas d’options dans PROC COMPARE pour ne créer un fichier que si au moins une différence entre les fichiers est trouvée.

proc compare data=sashelp.class compare=sashelp.class;
out=nodiff outnoequal outbase outcomp outdif
noprint;
id name;
run;

Vous devrez donc ensuite compléter votre programme à la suite de PROC COMPARE pour supprimer ces fichiers si c’est ce que vous avez besoin.

Votre commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l’aide de votre compte WordPress.com. Déconnexion /  Changer )

Image Twitter

Vous commentez à l’aide de votre compte Twitter. Déconnexion /  Changer )

Photo Facebook

Vous commentez à l’aide de votre compte Facebook. Déconnexion /  Changer )

Connexion à %s

%d blogueurs aiment cette page :