2015-10-05 80 views
0

在數據步驟中設置和調用宏變量時感到困惑。我有一系列「腫瘤」變量,只有其中一個包含我需要的信息。有一系列標誌(BIN)可以幫助我知道腫瘤數組的哪個部分可供參考。我怎麼可以這樣做以下:在數據步驟中分配宏變量

data tumors; 
    input ID $ BIN1 BIN2 Tumor1 Tumor2; 
    datalines; 
1001 0 0 12 00 
1002 1 0 01 01 
1003 0 1 00 12 
; 

data newdata; 
    set tumors; 
    if BIN1 = 1 then do; %let value = 1; end; 
    if BIN2 = 1 then do; %let value = 2; end; 
    if Tumor&value in ('00','01','02') then Stage=0; 
run; 

的代碼輸出「舞臺」全部爲空白,因爲我這樣做不恰當,但我不知道在哪裏的錯誤是(應該有不少爲0期上市)。有什麼建議?我希望它輸出以下內容:

data tumors_new; 
    input ID $ BIN1 BIN2 Tumor1 Tumor2 Stage; 
    datalines; 
1001 0 0 12 00 "" 
1002 1 0 01 02 01 
1003 0 1 00 12 12 
; 
+1

有可能是用數組而不是宏變量來做這件事的一種方法。你能發表一些(虛構的)樣本數據,以及你想從中產生什麼樣的例子嗎? – user667489

回答

1

在你的情況下,你不需要使用宏變量。你可以做這一切與數據步邏輯:

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在編譯任何其他代碼之前總是編譯宏語言元素第一個。編程時,始終假定您的宏代碼將被首先解釋。我只是記得這個編譯順序:

  1. 宏代碼
  2. SAS代碼

在上面的程序,SAS不會操作的順序如下:

  1. 分配1到宏變量value
  2. 2賦值給宏變量value
  3. 解析宏變量value2
  4. 編譯數據步驟,然後執行它

爲了彌補數據步驟和宏語言之間的間隙時,需要使用兩種功能之一:

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再次出現證實了這一點。

+1

感謝非常詳細的信息,這絕對清除了我。 – Stu

+0

也是,一個Stu到另一個,那不經常發生哈哈 – Stu