Vergleich von SAS Tabellen – Suchen nach gemeinsamen Tabellen

Aus SAS-Wiki
Wechseln zu: Navigation, Suche

Von Carina Ortseifen aus: Carina Ortseifen, Grischa Pfister, Heribert Ramroth, Marianne Weires: Tipps und Tricks für den leichteren Umgang mit der SAS Software, KSFE 2010.

Wer häufig mit mehreren Tabellen oder Generationen von einer Tabelle arbeitet, steht oft vor der Aufgabe, diese Tabellen vergleichen zu müssen. Insbesondere interessierte uns beim folgenden Tipp, welche gemeinsamen Variablen in den Tabellen vorhanden sind. Zur Bewältigung der Fragestellung kommen zum Einsatz:

  • PROC COMPARE
  • PROC DATASETS (bzw. PROC CONTENTS) und Datenschritt-Logik
  • Dictionary Tables (mit PROC SQL)

Gezeigt wird das ganze anhand der folgenden drei Beispieltabellen:

Data eins;
   Input x y z;
   Datalines;
1 2 3
;
Data zwei;
   Input x a y;
   Datalines;
1 1 1
;
* Der Name der Variable X ist groß geschrieben! *;
Data drei;
   X=1;
Run;

Die Prozedur COMPARE

Mit Hilfe der Prozedur COMPARE können zwei SAS-Tabellen – und nur genau zwei – miteinander verglichen werden. Für unseren Zweck genügt folgender Prozedurschritt:

Proc Compare Base=eins Compare=zwei Novalues;
Run;

Im Abschnitt „Variables Summary“ gibt die Prozedur unter anderem die Anzahl der gemeinsamen Variablen aus:

Number of Variables in Common: 2.

Die Prozedur liefert mir die Anzahlen, jedoch nicht die Namen der gemeinsamen Variablen.

Die Prozedur DATASETS mit Datenschritt-Logik

Mit der Prozedur DATASETS und der CONTENTS-Anweisung können die gemeinsamen Variablen extrahiert werden und in einem anschließenden Datenschritt mit MERGE, IN= und OUTPUT ausgelesen werden.


Damit das große X der Tabelle drei nicht „stört“ (der Anwender kann Groß- und Kleinbuchstaben verwenden, aber x und X bleibt das gleiche, nur nicht in unseren Vergleichen), werden mit der Systemoption VALIDVARNAME alle Variablennamen in Großbuchstaben ausgegeben:

Options Validvarname = Upcase;

Die Prozedur DATASETS greift auf die Bibliothek WORK zu. Die Anweisung CONTENTS kann mehrfach gesetzt werden und trägt mit Hilfe der Option OUT= die Variablennamen in neue Tabellen ein:

Proc Datasets Lib=work;
   Contents Data=eins Noprint Out=out1(Keep=name);
   Contents Data=zwei Noprint Out=out2(Keep=name);
   Contents Data=drei Noprint Out=out3(Keep=name);
Quit;

Die Option NOPRINT unterdrückt die Prozedurausgabe im Output-Fenster.


Die drei neuen Tabellen Out1, Out2 und Out3 werden im anschließenden Datenschritt bezüglich der Variablennamen mit MERGE verknüpft. Mittels der Dateioptionen IN= gelingt es, dann die Beobachtungen, also Variablennamen, herauszufiltern, die in allen drei Tabellen auftreten.

Data gemeinsam;
   Merge out1(in=a) out2(in=b) out3(in=c);
   By name;
   If a and b and c Then Output;
Run;
Title "Gemeinsame Variablen der Tabellen eins, zwei und drei";
Proc Print;
Run;

Und wir erhalten die gewünschte Ausgabe:

Gemeinsame Variablen der Tabellen eins, zwei und drei
       Obs    NAME
        1      X

Dictionary Tables

Der Vollständigkeit wegen sollen hier auch noch die Dictionary Tables erwähnt werden, mit deren Hilfe man die gesuchte Information natürlich auch erhält.

Mit einem Prozedur SQL-Schritt greift man auf die Dictionary.Columns zu, die die Variableninformation enthält, beschränkt sich auf die drei Ausgangstabellen und gruppiert und addiert:

Proc SQL;
 * Describe Table Dictionary.Columns;
   Create Table gemeinsamSQL (Drop=anz) As
      Select name,count(*) As anz
      From (
         Select libname, memname, name
         From Dictionary.Columns
         Where libname='WORK' And memname In ('EINS','ZWEI','DREI'))
      Group By name
      Having anz = 3
   ;
Quit;

Ein anschließender PROC PRINT-Schritt liefert das identische Ergebnis zur Prozedur DATASETS-Variante.

Literatur

[1] Support-Website von SAS Institute: http://support.sas.com/kb/38/059.html