2015-10-17 49 views
-2

有誰知道我可以更正以下內容?數字操作數是否必需?

CODE:

%macro variables(list); 
    data tire.Import2(drop=i count); 
    set tire.Import; 
    by Away_Team; 

    %let n=%sysfunc(countw(&list)); 
    %DO k=1 %TO &n; 
    %let val = %scan (&list,&k); 

    array x(*) &val.lag1-&val.lag6; 
    &val.lag1=lag1(&val); 
    &val.lag2=lag2(&val)+lag1(&val); 
    &val.lag3=lag3(&val)+lag2(&val)+lag1(&val); 
    &val.lag4=lag4(&val)+lag3(&val)+lag2(&val)+lag1(&val); 
    &val.lag5=lag5(&val)+lag4(&val)+lag3(&val)+lag2(&val)+lag1(&val); 
    &val.lag6=lag6(&val)+lag5(&val)+lag4(&val)+lag3(&val)+lag2(&val)+lag1(&val); 

    %if %str(first.Away_Team) %then count=1; 

    %do i=count %to dim(x); 
    x(i)=.; 
    %end; 
    count + 1; 

    run; 
    %end; 
    %mend; 
    %variables(FTHG FTHGC); 

ERROR: A character operand was found in the %EVAL function or %IF condition where a numeric operand is required. The condition was: %str(first.Away_Team) ERROR: The macro VARIABLES will stop executing.

我嘗試使用%bquote%str但沒有運氣!

+0

我不知道SAS語言,但Google很快說%str是_quoting函數_。這聽起來像是將引號放在參數上,然後它不再是適用於%if的數值。 –

+0

您的宏%循環在最後應該可能是一個數據步驟循環。 – Quentin

+0

也是你的%if%str(第一個)。應該是如果第一。 – Quentin

回答

1

您的宏將宏%IF語句與數據步IF語句以及%DO循環與DO循環混淆。宏語言(%IF%DO等)用於生成SAS代碼。它不知道SAS數據集或數據集變量的值。它只是一種文本處理語言。 SAS數據步驟語言(IF DO等)用於讀取和處理數據。

當你寫:

%if %str(first.Away_Team) %then count=1; 

這是一個宏%IF語句。宏語言不知道數據集變量,如first.Away_Team。所以宏%if語句正在測試表達式%str(first.Away_Team)是否爲真。這只是宏語言的一個文本字符串;它並不知道first.Away_Team是一個數值步驟變量,其值爲1或0.所以它會拋出一個錯誤。

這應該只是一個普通的IF語句:

if first.Away_Team then count=1 

數據跳躍IF語句可以測試first.Away_Team的價值。

與您的%DO循環相似。您不能:%do i=count %to dim(x);,因爲宏語言%DO語句不知道COUNT是具有值的數據集變量,或者dim(x)是名爲x的數組中的元素數。對於宏語言,它們都是文本字符串。你可以do i=count to dim(x);

我建議你首先編寫你的數據步驟,根本沒有宏或宏變量,然後像FTHG和FTHGC那樣工作。然後,在知道正在運行的SAS代碼是什麼後,您可以嘗試編寫一個將生成該代碼的宏。

+0

感謝您的反饋Quentin! 我改變了我的方法,讓代碼運行! – Sasmania

相關問題