Austausch von Variablenlisten zwischen PROC SQL und SAS-Prozeduren/Datasteps

Aus SAS-Wiki
Wechseln zu: Navigation, Suche

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

Werden Variablenlisten im Makro eingegeben, so mag die Situation auftreten, dass ein Ergebnis leichter mit einer SQL-Anweisung erreicht werden kann. Allgemeiner ausgedrückt, die gleichen Variablenlisten sollen sowohl in Prozeduren als auch in PROC SQL verwendet werden. Die Syntax von PROC SQL erfordert jedoch die Trennung der Variablen durch Kommata, im Gegensatz zum allgemeinen Prozedurschritt.

proc print data=sashelp.class ;
     var Age Height Weight ;
proc corr data=sashelp.class ;
     var Age Height Weight ;
proc sql;
     select Age, Height, Weight from sashelp.class;
quit;

Die Liste der Variablen, die hier zum Beispiel über %LET übergeben wird, lässt sich in PROC SQL also nicht verwenden.

%LET VarList = Age Height Weight ;

Lösung 1

Durch Anwendung der Funktion %sysfunc lassen sich jedoch normale SAS-Prozeduren auch im Makro-Zusammenhang anwenden. Die Funktion translate ersetzt im folgenden Schritt die Leerzeichen zwischen den Variablen durch Kommata, %sysfunc ermöglicht die Anwendung außerhalb des Datenschrittes.

%LET VarList = Age Height Weight ;
%LET SqlVarList=%sysfunc(translate(&VarList.,", ", " "));
proc print data=sashelp.class ;
     var &VarList.;
proc corr data=sashelp.class ;
     var &VarList.;
proc sql;
     select &SqlVarList. from sashelp.class;
quit;

Lösung 2

Durch Anwendung eines Makros aus der SAS-Hilfe lässt sich ein Text-String schnell in seine Einzelteile zerlegen.

…
%LET Nr = 0;
%DO %WHILE(%SCAN(&VarList,&Nr.+1,%STR( ))^=);
    %LET Nr = %EVAL (&Nr.+1);
    %LET VarNr&Nr.=%SCAN(&VarList,&Nr.,%STR( ));
%END;
…

Dies kann zum Beispiel im Falle der Berechnung roher und adjustierter Odds Ratios nötig sein. Der obige Code erzeugt die Makrovariablen:

  • VarNr1 = Age
  • VarNr2 = Height
  • VarNr3 = Weight

Wenn man die Variablenliste nun sowieso schon zerlegt vorliegen hat, kann man diese auch auf einfache Art wieder mit neuem Trennzeichen zusammensetzen:

%MACRO VarListKomma;
     &VarNr1. %DO I=2 %TO &Nr.;, &&VarNr&I. %END;
%MEND VarListKomma;
%PUT SqlListe = %VarListKomma;

Somit sieht die Makro-Variable SqlListe wie folgt aus: Age, Height, Weight