2015-05-07 7 views
5

Chcę utworzyć coś w SAS, które działa jak funkcja wyszukiwania Excel. Zasadniczo ustawiam wartości dla zmiennych makr var1, var2, ... i chcę znaleźć ich numer indeksu zgodnie z tabelą ref. Ale dostaję następujące komunikaty w kroku danych.Zmienna makro jest niezainicjowana po wydaniu polecenia% let w sas

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

Podczas drukowania zmiennych &num1, &num2, otrzymuję nic. Oto mój kod.

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; 

mogę uzyskać poprawne wartości dla &num1, &num2 .. gdybym wpisać varname='A' w rachunku if-then. A jeśli później zmienię oświadczenie z powrotem na varname=&var1, nadal będę mógł uzyskać wymagane dane wyjściowe. Ale dlaczego tak jest? Nie chcę wprowadzać rzeczywistej wartości ciągu, a następnie zmienić ją z powrotem na zmienną makro, aby uzyskać wynik za każdym razem.

+1

sugeruję zrobić wyszukiwania na http://www.lexjansen.com/ dla "lookup", aby znaleźć dokumenty SAS na wiele różnych sposobów, aby zrobić to w SAS. – DWal

Odpowiedz

8

Rozwiązanie problemu natychmiastowym

musisz owinąć zmiennych makro w cudzysłowach, jeśli chcesz SAS traktować ich jako stałych łańcuchowych. W przeciwnym razie potraktuje je w taki sam sposób jak inne losowe bity tekstu znalezionego w kroku danych.

Można również ponownie zdefiniować warianty makr, aby uwzględnić cudzysłowy.

Jako dodatkową opcję można użyć funkcji symget lub resolve, ale zazwyczaj nie są one potrzebne, chyba że chcesz utworzyć zmienną makro i użyć jej ponownie w tym samym kroku danych. Jeśli użyjesz ich jako zamiennika podwójnych cudzysłowów, zwykle używają o wiele więcej procesora, ponieważ będą one domyślnie oceniały warianty makro raz na wiersz - normalnie warianty makr są oceniane tylko raz, podczas kompilacji, przed wykonaniem kodu.

Lepsze podejście?

Dla tego rodzaju wyszukiwania, w rzeczywistości nie trzeba w ogóle używać zestawu danych - można zamiast tego zdefiniować niestandardowy format, który zapewnia większą elastyczność w sposobie korzystania z niego. Na przykład. Stwarza to format o nazwie lookup:

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

Następnie można użyć formatu tak:

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

Albo w etapie danych:

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

Rozumiem. Dziękujemy za przedstawienie alternatywy! – Yimai

+2

Dobra odpowiedź. Możesz również wyjaśnić, jak utworzyć format z zestawu danych tutaj (biorąc pod uwagę, że użytkownik może już mieć to wyszukiwanie w zbiorze danych). – Joe

Powiązane problemy