SAS9

Renommer automatiquement des variables lors d'un Merge ?

Simon 17 vues

Lorsque vous fusionnez deux tables (ALPHA et BETA) qui contiennent les mêmes variables (ex: X, Y, Z) pour les comparer, SAS© écrase par défaut les valeurs de la première table par celles de la seconde.


Pour éviter cela et calculer des différences (ex: X_Diff = X - X_Beta), vous êtes souvent obligé d'écrire une instruction RENAME interminable :

1/* La méthode laborieuse */
2DATA test;
3 MERGE alpha
4 beta(rename=(X=X_Beta Y=Y_Beta Z=Z_Beta ...)); /* Fastidieux si 50 variables ! */
5 BY id;
6 Diff_X = X - X_Beta;
7RUN;
Existe-t-il une option magique de type "Auto-Rename" ? Non, pas nativement dans le Data Step. Mais voici les trois solutions proposées par les experts pour contourner cette corvée.

1. La Solution SQL : L'usage des Alias

C'est souvent l'alternative la plus propre. Contrairement au Data Step, PROC SQL permet de manipuler deux colonnes de même nom en les préfixant par leur table d'origine (alias).

Vous n'avez pas besoin de renommer les variables avant le calcul, vous le faites à la volée.

1PROC SQL;
2 create TABLE test as
3 select a.id,
4 a.X,
5 b.X as X_Beta, /* Renommage simple pour la sortie */
6 (a.X - b.X) as Diff_X, /* Calcul direct sans renommage préalable */
7 (a.Y - b.Y) as Diff_Y
8 from alpha as a,
9 beta as b
10 where a.id = b.id;
11QUIT;
Avantage : Code plus lisible et logique mathématique directe.

2. La Solution "Outil Dédié" : PROC COMPARE

Si votre objectif est uniquement de comparer les tables pour voir les différences, arrêtez de réinventer la roue avec un Data Step ! SAS© dispose d'une procédure conçue exactement pour cela, qui gère les noms identiques automatiquement.

1PROC COMPARE base=alpha compare=beta;
2 id id;
3 var X Y Z;
4RUN;

3. La Solution "Hacker" : Macro Dynamique

Si vous tenez absolument à utiliser un Data Step MERGE et que vous avez 100 variables à renommer, la solution est de générer la liste RENAME=(...) dynamiquement via une Macro.

Le principe est le suivant :

  1. Lire les métadonnées de la table BETA (via PROC CONTENTS ou les vues dictionnaires).

  2. Construire une chaîne de caractères : X=X_Beta Y=Y_Beta ....

  3. Injecter cette chaîne dans le code.

1%macro auto_rename(lib, ds, suffix);
2 /* Code simplifié pour l'exemple */
3 PROC SQL noprint;
4 select catx('=', name, catx('_', name, "&suffix"))
5 into :renamelist separated BY ' '
6 from dictionary.columns
7 where LIBNAME=upcase("&lib") and memname=upcase("&ds");
8 QUIT;
9 /* Renvoie la chaîne générée */
10 &renamelist
11%mend;
12 
13/* Utilisation */
14DATA test;
15 MERGE alpha
16 beta(rename=( %auto_rename(WORK, BETA, Beta) ));
17 BY id;
18RUN;

Résumé

BesoinSolution Recommandée
Calculer des écarts sur quelques variablesPROC SQL (Utilisez les alias a.var - b.var).
Vérifier si deux tables sont identiquesPROC COMPARE (C'est fait pour ça).
Fusionner 50+ variables identiques dans une table

Parfois, la difficulté de faire quelque chose en Base SAS© est un signal qu'il ne faut pas le faire ainsi." Si vous passez une heure à écrire un renommage massif, c'est probablement que PROC COMPARE était la solution depuis le début.