在你的情況下,你不需要使用宏變量。你可以做這一切與數據步邏輯:
data newdata;
set olddata;
array Tumor[2];
if(BIN1 = 1) then value = 1;
if(BIN2 = 2) then value = 2;
if(value IN(1, 2)) then do; *Prevent errors from occuring if value is missing;
if(Tumor[value]) in ('00','01','02') then Stage=0;
end;
run;
假設你的變量名是Tumor1, Tumor2
,我們初始化命名Tumor
含2個值的數組,它會自動被命名爲Tumor1和Tumor2。
說明
宏設施是從SAS數據步驟單獨的編程語言。只有少數連接兩種語言的數據步驟功能。這不起作用的原因是因爲SAS在編譯任何其他代碼之前總是編譯宏語言元素第一個。編程時,始終假定您的宏代碼將被首先解釋。我只是記得這個編譯順序:
- 宏代碼
- SAS代碼
在上面的程序,SAS不會操作的順序如下:
- 分配
1
到宏變量value
- 將
2
賦值給宏變量value
- 解析宏變量
value
到2
- 編譯數據步驟,然後執行它
爲了彌補數據步驟和宏語言之間的間隙時,需要使用兩種功能之一:
call symput('macro variable name', variable or constant)
call symputx('macro variable name', scope <'G' or 'L'>)
symput
(靜置小號 ymbol P UT)將在數據步驟變量的值讀入宏變量,但只爲該記錄。這是棘手的部分。由於數據步驟自然循環,它會不斷覆蓋宏變量的值直到文件標記結束。出於這個原因,找到嵌入條件中的call symput
例程非常普遍。
對於symput
,您無法直接在數據步驟中使用該宏變量。它僅在數據步驟完成後纔可用。例如,不能使用這樣的邏輯:
data foo;
set bar;
call symput('macvar', var);
if(&macvar = 1) then put 'Woo!';
run;
這將產生錯誤
ERROR 22-322: Syntax error, expecting one of the following: a name, a quoted string, a numeric constant, a datetime constant, a missing value, INPUT, PUT.
WARNING: Apparent symbolic reference MACVAR not resolved.
這是因爲macvar
未給出一個值,直到數據的結束步驟,在if
語句中導致錯誤(並且由於錯誤,symput
從不運行,因此macvar
從不創建)。到SAS,該if
上述聲明的樣子:
if(= 1);
您可以通過在代碼輸入和發現Error 22-322
再次出現證實了這一點。
有可能是用數組而不是宏變量來做這件事的一種方法。你能發表一些(虛構的)樣本數據,以及你想從中產生什麼樣的例子嗎? – user667489