在数据处理时遇到了个问题,首先是关于call symput的执行原理,下面是我对其执行的测试
data _NULL;
do i=1 to 4;
call symput("is",put(i,2.)) ;
a=&is;
put a=;
end;
run;
结果是:
a=4
a=4
a=4
a=4
请问为什么不是a=1, 2, 3, 4? 而只是4?
由于没有搞清以上call symput原理,我的程序无法运行,以下是我想处理的程序:
dataset sitesmiddle为:
type group1 group2 group 3 group4
rb 7 7 7 6
ub 2 3 2 2
s 4 4 5 7
我希望将 rb ub s所对应的group1--group4数据分别赋给宏变量,如rb对应group1值赋给宏变量rb1, group2赋给rb2....,ub对应group1赋给ub1...以此类推。
所得宏变量将用于以后的计算;以下是程序:
data _NULL_;
set sitesmiddle;
do i=1 to 4;
call symput("is",put(i,1.));
if type='rb' then call symput("rb"||left(put(i,1.)),group&is);
if type='ub' then call symput("ub"||left(put(i,1.)),group&is);
if type='s' then call symput("s"||left(put(i,1.)),group&is);
end;
run;
%macro try;
%do mn=1 %to 4;
%put rb=&&rb&mn ub=&&ub&mn s=&&s&mn;
%end;
%mend try;
%try;
请问问题到底出在哪里?
我尝试将do loop放到data _NULL_以外用作%do loop后取消了call symput("is",put(i,1.));一句后是可以得到我想要的结果的,见下:
%macro try;
%do mn=1 %to 4;
data _NULL_;
set sitesmiddle;
if type='rb' then call symput("rb&mn",put(group&mn,2.));
if type='ub' then call symput("ub&mn",put(group&mn,2.));
if type='s' then call symput("s&mn",put(group&mn,2.));
run;
%put rb=&&rb&mn ub=&&ub&mn s=&&s&mn;
%end;
%mend try;
%try;
是不是说明call symput语句适用于%do loop而不适用于dataset内的do loop?
请大虾帮忙指点迷津。