我尝试通过编写下面的SAS代码来构建表2,但我得到的是表1.我无法弄清楚我错过了什么。非常感谢谢谢。
&counter = 4
data new;set set1;
total = 0;
a = 1;
do i = 1 to &counter;
call symputX('a',a);
total = total + Tem_&a.;
a = symget('a')+1;
call symputX('a',a);
end;
run;
Table 1
ID Amt Tem_1 Tem_2 Tem_3 Tem_4 total
4 500 1 4 5 900 3600
5 200 50 100 200 0 0
9 50 40 0 0 0 0
10 500 70 100 250 0 0
Table 2
ID Amt Tem_1 Tem_2 Tem_3 Tem_4 total
4 500 1 4 5 900 910
5 200 50 100 200 0 350
9 50 40 0 0 0 40
10 500 70 100 250 0 420
答案 0 :(得分:2)
不幸的是,你不能以这种方式使用SYMPUT和SYMGET。虽然您可以使用它们来存储/检索宏变量值,但您无法在执行后更改发送到编译器的代码。
基本上,SAS在查看任何数据(这称为编译)之前,必须弄清楚机器代码在数据步循环的每次迭代中应该做什么。所以问题是,你不能定义tem_&a.
并期望被允许改变执行期间_&a.
的内容,因为它会改变机器代码需要做的事情,而SAS无法&# 39;为此做好充分准备。
因此,编写程序时,您编写&a.
的内容将被解析,而&a.
在您的数据步骤之前所具有的值tem_&a.
将成为&a. does not resolve
。大概是你第一次运行它时会出错(call symput
然后出现关于变量名称非法的错误),最后&a
完成了它的工作,tem_&a.
得到了4在循环结束时,你的tem_4
将永远解决为 data new;
set set1;
total = 0;
array tem[&counter.] tem_1-tem_&counter.;
a = 1;
do i = 1 to &counter; *or do i = 1 to dim(tem);
total = total + Tem[i];
end;
run;
。
解决方案?不要为此使用宏。相反,使用数组。
data new;
set set1;
total = sum(of tem_1-tem_4);
run;
或者,当然,只是直接总结它们。
data new;
set set1;
total = 0;
%do i = 1 %to &counter;
total = total + Tem_&i.;
%end;
run;
如果你真的喜欢宏变量,你当然可以在宏 do循环中执行此操作,尽管这是不为此建议的,因为它是最好坚持使用数据步骤技术。但无论如何,如果你在宏中运行它(这在开放代码中无效),这应该可行。
is_login(tinyint)