需要数字操作数吗?
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 代码是什么之后,你可以尝试编写一个宏来生成该代码。
有谁知道我该如何更正以下内容?
代码:
%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 代码是什么之后,你可以尝试编写一个宏来生成该代码。