SAS9

¿Renombrar automáticamente variables durante un Merge?

Simon 11 vues

Cuando fusionas dos tablas (ALPHA y BETA) que contienen las mismas variables (ej: X, Y, Z) para compararlas, SAS© sobrescribe por defecto los valores de la primera tabla con los de la segunda.


Para evitar esto y calcular diferencias (ej: X_Diff = X - X_Beta), a menudo te ves obligado a escribir una interminable instrucción RENAME:

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 una opción mágica de tipo "Auto-Renombrar"? No, no de forma nativa en el Data Step. Pero aquí están las tres soluciones propuestas por los expertos para sortear esta tarea tediosa.

1. La Solución SQL: El uso de Alias

A menudo es la alternativa más limpia. A diferencia del Data Step, PROC SQL permite manipular dos columnas con el mismo nombre prefijándolas con su tabla de origen (alias).

No necesitas renombrar las variables antes del cálculo, lo haces sobre la marcha.

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;
Ventaja: Código más legible y lógica matemática directa.

2. La Solución "Herramienta Dedicada": PROC COMPARE

Si tu objetivo es únicamente comparar las tablas para ver las diferencias, ¡deja de reinventar la rueda con un Data Step! SAS© dispone de un procedimiento diseñado exactamente para esto, que gestiona los nombres idénticos automáticamente.

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

3. La Solución "Hacker": Macro Dinámica

Si te empeñas en usar un Data Step MERGE y tienes más de 50 variables que renombrar, la solución es generar la lista RENAME=(...) dinámicamente mediante una Macro.

El principio es el siguiente:

  1. Leer los metadatos de la tabla BETA (a través de PROC CONTENTS o las vistas de diccionario).

  2. Construir una cadena de caracteres: X=X_Beta Y=Y_Beta ....

  3. Inyectar esta cadena en el código.

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;

Resumen

NecesidadSolución Recomendada
Calcular desviaciones en algunas variablesPROC SQL (Usa los alias a.var - b.var).
Verificar si dos tablas son idénticasPROC COMPARE (Está hecho para eso).
Fusionar más de 50 variables idénticas en una tabla

A veces, la dificultad de hacer algo en Base SAS© es una señal de que no debe hacerse así. Si pasas una hora escribiendo un renombrado masivo, es probable que PROC COMPARE fuera la solución desde el principio.