ID a1 a2 a3 a4 _1 _2 _3 _4 _5 _6 _7 _8 _9
1 _1 _3 _6 _9 8 5 9 8 6 10 2 1 4
2 _2 _5 _8 _9 10 6 2 7 10 8 3 5 9
3 _1 _2 _4 _8 3 6 1 9 6 9 3 0 4
... ... ...
这里a1-a4显示列号,它们对应变量名_1-_9.I想要创建三个变量v1,v2,v3,其中
For ID=1, v1=sum(of _1-_3), v2=sum(of _3-_6),v3=sum(of _6-_9);
For ID=2, v1=sum(of _2-_5), v2=sum(of _5-_8),v3=sum(of _8-_9);
For ID=3, v1=sum(of _1-_2), v2=sum(of _2-_4),v3=sum(of _4-_8);
.... ...
例如,对于ID = 1,v1 = 8 + 5 + 9 = 22,v2 = 9 + 8 + 6 + 10 = 33。
这是我的代码:
%Macro sumup;
data test; set test;
%do n=1 %to 3;
v&n=sum (of a&n-a%eval(&n+1));
%end;
run;
%mend;
%sumup;
问题是a& n和%eval(& n + 1)被视为变量名。但我想将它们的值视为变量名。我知道在调用执行中我们可以使用'|| a& n ||'。但宏观怎么样?谢谢!
答案 0 :(得分:2)
你无法直接访问它; SAS需要知道如何在知道实际值之前编译指令。但是,您可以使用数组执行此操作。
data want;
set test;
array nums _1-_9;
array as a1-a4;
array vs v1-v3;
do n=1 to 3;
do i = as[n] to as[n+1];
vs[n] = sum(vs[n],nums[i]);
end;
end;
run;