SAS9

Variablen beim Merge automatisch umbenennen?

Simon 11 Aufrufe

Wenn Sie zwei Tabellen (ALPHA und BETA) zusammenführen, die dieselben Variablen (z.B. X, Y, Z) enthalten, um sie zu vergleichen, überschreibt SAS© standardmäßig die Werte der ersten Tabelle mit denen der zweiten.


Um dies zu vermeiden und Differenzen zu berechnen (z.B. X_Diff = X - X_Beta), sind Sie oft gezwungen, eine endlose RENAME-Anweisung zu schreiben:

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;
Gibt es eine magische "Auto-Rename"-Option? Nein, nicht nativ im Data Step. Aber hier sind die drei Lösungen, die Experten vorschlagen, um diese lästige Aufgabe zu umgehen.

1. Die SQL-Lösung: Verwendung von Aliasen

Dies ist oft die sauberste Alternative. Im Gegensatz zum Data Step ermöglicht PROC SQL die Manipulation von zwei Spalten mit demselben Namen, indem sie mit ihrer Ursprungstabelle (Alias) präfigiert werden.

Sie müssen die Variablen nicht vor der Berechnung umbenennen, Sie tun es im laufenden Betrieb.

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;
Vorteil: Besser lesbarer Code und direkte mathematische Logik.

2. Die "Dediziertes Tool"-Lösung: PROC COMPARE

Wenn Ihr Ziel nur darin besteht, die Tabellen zu vergleichen, um die Unterschiede zu sehen, hören Sie auf, das Rad mit einem Data Step neu zu erfinden! SAS© verfügt über eine Prozedur, die genau dafür entwickelt wurde und identische Namen automatisch verwaltet.

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

3. Die "Hacker"-Lösung: Dynamisches Makro

Wenn Sie unbedingt einen Data Step MERGE verwenden möchten und 100 Variablen umbenennen müssen, besteht die Lösung darin, die Liste RENAME=(...) dynamisch über ein Makro zu generieren.

Das Prinzip ist wie folgt:

  1. Lesen Sie die Metadaten der BETA-Tabelle (über PROC CONTENTS oder die Dictionary-Views).

  2. Erstellen Sie eine Zeichenkette: X=X_Beta Y=Y_Beta ....

  3. Fügen Sie diese Zeichenkette in den Code ein.

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;

Zusammenfassung

BedarfEmpfohlene Lösung
Berechnung von Abweichungen für einige VariablenPROC SQL (Verwenden Sie Aliase a.var - b.var).
Überprüfung, ob zwei Tabellen identisch sindPROC COMPARE (Dafür ist es gemacht).
Zusammenführen von 50+ identischen Variablen in einer Tabelle

Manchmal ist die Schwierigkeit, etwas in Base SAS© zu tun, ein Zeichen dafür, dass man es nicht so tun sollte." Wenn Sie eine Stunde damit verbringen, eine massive Umbenennung zu schreiben, ist es wahrscheinlich, dass PROC COMPARE von Anfang an die Lösung war.