需要数字操作数吗?

Numeric Operand Is Required?

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

代码:

    %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 但没有成功!

您的宏混淆了宏 %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 代码是什么之后,你可以尝试编写一个宏来生成该代码。