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.
proc sql;
create table test as
select a.id,
a.X,
b.X as X_Beta, /* Renommage simple pour la sortie */
(a.X - b.X) as Diff_X, /* Calcul direct sans renommage préalable */
(a.Y - b.Y) as Diff_Y
from alpha as a,
beta as b
where a.id = b.id;
quit;
1
PROC 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;
11
QUIT;
Avantage : Code plus lisible et logique mathématique directe.
proc compare base=alpha compare=beta;
id id;
var X Y Z;
run;
1
PROC COMPARE base=alpha compare=beta;
2
id id;
3
var X Y Z;
4
RUN;
3. La Solution "Hacker" : Macro Dynamique
Si vous tenez absolument à utiliser un Data StepMERGE 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 :
Lire les métadonnées de la table BETA (via PROC CONTENTS ou les vues dictionnaires).
Construire une chaîne de caractères : X=X_Beta Y=Y_Beta ....
Injecter cette chaîne dans le code.
%macro auto_rename(lib, ds, suffix);
/* Code simplifié pour l'exemple */
proc sql noprint;
select catx('=', name, catx('_', name, "&suffix"))
into :renamelist separated by ' '
from dictionary.columns
where libname=upcase("&lib") and memname=upcase("&ds");
quit;
/* Renvoie la chaîne générée */
&renamelist
%mend;
/* Utilisation */
data test;
merge alpha
beta(rename=( %auto_rename(WORK, BETA, Beta) ));
by id;
run;
The codes and examples provided on WeAreCAS.eu are for educational purposes. It is imperative not to blindly copy-paste them into your production environments. The best approach is to understand the logic before applying it. We strongly recommend testing these scripts in a test environment (Sandbox/Dev). WeAreCAS accepts no responsibility for any impact or data loss on your systems.
SAS and all other SAS Institute Inc. product or service names are registered trademarks or trademarks of SAS Institute Inc. in the USA and other countries. ® indicates USA registration. WeAreCAS is an independent community site and is not affiliated with SAS Institute Inc.
This site uses technical and analytical cookies to improve your experience.
Read more.