2015-05-07 11 views
5

Ich möchte etwas in SAS erstellen, die wie eine Excel-Lookup-Funktion funktioniert. Grundsätzlich setze ich die Werte für die Makrovariablen var1, var2, ... und ich möchte ihre Indexnummer nach der Tabelle ref finden. Aber ich bekomme folgende Daten im Datenschritt.Makro-Variable ist nicht initialisiert nach% let-Anweisung in sas

NOTE: Variable A is uninitialized. 
NOTE: Variable B is uninitialized. 
NOTE: Variable NULL is uninitialized. 

Wenn ich die Variablen drucken &num1, &num2, bekomme ich nichts. Hier ist mein Code.

data ref; 
    input index varname $; 
    datalines; 
0 NULL 
1 A 
2 B 
3 C 
; 
run; 

%let var1=A; 
%let var2=B; 
%let var3=NULL; 

data temp; 
    set ref; 
    if varname=&var1 then call symput('num1',trim(left(index))); 
    if varname=&var2 then call symput('num2',trim(left(index))); 
    if varname=&var3 then call symput('num3',trim(left(index))); 
run; 

%put &num1; 
%put &num2; 
%put &num3; 

Ich kann die richtigen Werte für &num1 bekommen, &num2, .. wenn ich varname='A' in der if-then Anweisung geben. Und wenn ich die Anweisung später wieder auf varname=&var1 ändere, kann ich immer noch die benötigte Ausgabe bekommen. Aber warum ist es so? Ich möchte den tatsächlichen Zeichenfolgenwert nicht eingeben und dann zurück in Makrovariable ändern, um das Ergebnis jedes Mal zu erhalten.

+1

Ich würde vorschlagen, dass Sie eine Suche auf http://www.lexjansen.com/ für "lookup", um SAS-Papiere über die vielen verschiedenen Möglichkeiten zu finden, solche Dinge in SAS zu tun. – DWal

Antwort

8

Lösung zum sofortigen Problem

Sie benötigen Makrovariablen in doppelten Anführungszeichen wickeln, wenn Sie SAS wollen, dass sie als String-Konstanten zu behandeln. Andernfalls behandelt es sie genauso wie alle anderen zufälligen Textabschnitte, die in Ihrem Datenschritt gefunden werden.

Alternativ könnten Sie die Makro-Vars neu definieren, um die Anführungszeichen einzuschließen. Als weitere Option können Sie die Funktionen symget oder resolve verwenden, die normalerweise nicht benötigt werden, es sei denn, Sie möchten eine Makrovariable erstellen und sie innerhalb desselben Datenschritts erneut verwenden. Wenn Sie sie als Ersatz für doppelte Anführungszeichen verwenden, neigen sie dazu, viel mehr CPU zu verwenden, da sie die Makrovars standardmäßig einmal pro Zeile auswerten. Normalerweise werden Makrovars nur einmal zur Kompilierungszeit ausgewertet, bevor Ihr Code ausgeführt wird.

Ein besserer Ansatz?

Für die Art von Lookup, die Sie tun, müssen Sie überhaupt kein Dataset verwenden - Sie können stattdessen ein benutzerdefiniertes Format definieren, das Ihnen viel mehr Flexibilität bei der Verwendung gibt. Z.B. dies erzeugt ein Format lookup genannt:

proc format; 
    value lookup 
    1 = 'A' 
    2 = 'B' 
    3 = 'C' 
    other = '#N/A' /*Since this is what vlookup would do :) */ 
    ; 
run; 

Dann können Sie das Format wie so verwenden:

%let testvar = 1; 
%let testvar_lookup = %sysfunc(putn(&testvar, lookup.)); 

Oder in einem Daten Schritt:

data _null_; 
    var1 = 1; 
    format var1 lookup.; 
    put var1=; 
run; 
+0

Ich sehe. Danke für die Einführung der Alternative! – Yimai

+2

Gute Antwort. Sie können auch erklären, wie Sie hier ein Format aus einem Dataset erstellen (vorausgesetzt, der Benutzer verfügt möglicherweise bereits über diese Suche in einem Dataset). – Joe

Verwandte Themen