2015-05-07 17 views
5

Tôi muốn tạo ra một cái gì đó trong SAS hoạt động như một chức năng tra cứu Excel. Về cơ bản, tôi đặt giá trị cho các biến macro var1, var2, ... và tôi muốn tìm số chỉ mục của chúng theo bảng ref. Nhưng tôi nhận được các thông báo sau trong bước dữ liệu.biến vĩ mô là uninitialized sau khi% let tuyên bố trong sas

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

Khi tôi in các biến &num1, &num2, tôi nhận được gì. Đây là mã của tôi.

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; 

tôi có thể nhận các giá trị chính xác cho &num1, &num2, .. nếu tôi gõ varname='A' trong báo cáo if-then. Và nếu sau đó tôi đổi câu trả lời thành varname=&var1, tôi vẫn có thể nhận được kết quả yêu cầu. Nhưng tại sao nó như vậy? Tôi không muốn nhập giá trị chuỗi thực tế và sau đó thay đổi nó trở lại biến vĩ mô để có được kết quả mọi lúc.

+1

tôi muốn đề nghị bạn thực hiện tìm kiếm trên http://www.lexjansen.com/ cho "tra cứu" để tìm giấy tờ SAS trên nhiều cách khác nhau để làm điều này loại điều trong SAS. – DWal

Trả lời

8

Giải pháp cho vấn đề ngay lập tức

Bạn cần phải quấn biến vĩ mô của bạn trong dấu ngoặc kép nếu bạn muốn SAS đối xử với họ như hằng chuỗi. Nếu không, nó sẽ xử lý chúng giống như bất kỳ bit ngẫu nhiên nào khác của văn bản mà nó tìm thấy trong bước dữ liệu của bạn.

Hoặc, bạn có thể xác định lại các vars macro để bao gồm các dấu ngoặc kép. Là một tùy chọn khác, bạn có thể sử dụng các hàm symget hoặc resolve, nhưng thường không cần thiết trừ khi bạn muốn tạo biến macro và sử dụng lại một lần nữa trong cùng một bước dữ liệu. Nếu bạn sử dụng chúng như một sự thay thế cho các dấu ngoặc kép, chúng có khuynh hướng sử dụng nhiều CPU hơn vì chúng sẽ đánh giá các vars macro một lần mỗi hàng theo mặc định - thông thường, vars macro được đánh giá chỉ một lần, tại thời gian biên dịch trước khi mã của bạn thực hiện.

Một cách tiếp cận tốt hơn?

Đối với loại tra cứu bạn đang thực hiện, bạn thực sự không cần phải sử dụng tập dữ liệu - thay vào đó bạn có thể xác định định dạng tùy chỉnh, giúp bạn linh hoạt hơn trong cách sử dụng. Ví dụ. điều này tạo ra một định dạng được gọi lookup:

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

Sau đó, bạn có thể sử dụng các định dạng như sau:

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

Hoặc trong một bước dữ liệu:

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

Tôi hiểu. Cảm ơn bạn đã giới thiệu phương án thay thế! – Yimai

+2

Câu trả lời hay. Bạn cũng có thể muốn giải thích cách tạo định dạng từ tập dữ liệu tại đây (do người dùng có thể đã có tra cứu này trong tập dữ liệu). – Joe

Các vấn đề liên quan