如何将变量的值传递给Macro SAS中函数的参数?

时间:2013-09-27 18:34:19

标签: loops macros sas

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 ||'。但宏观怎么样?谢谢!

1 个答案:

答案 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;