需要数字操作数吗?

时间:2015-10-17 10:43:59

标签: string macros sas eval numeric

有谁知道我如何纠正以下内容?

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);
  

错误:在%EVAL函数或%IF中找到了字符操作数   条件,其中需要数字操作数。条件是:   %str(first.Away_Team)错误:宏VARIABLES将停止执行。

我尝试使用%bquote%str,但没有运气!

1 个答案:

答案 0 :(得分: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代码是什么之后,您可以尝试编写一个将生成该代码的宏。