有谁知道我如何纠正以下内容?
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
,但没有运气!
答案 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代码是什么之后,您可以尝试编写一个将生成该代码的宏。