2015-10-17 78 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

相关问题