我有以下SAS代码然后可以运行。挑战是我必须重复这么多次,看起来真的很尴尬。我需要Trans1-Tran2,TransOut1-TransOut100,BBB,AAA,VCS是用户定义的,没有趋势可循。
%transform(Trans1,BBB,TransOut1);
%transform(Trans2,AAA,TransOut2);
%transform(Trans3,VCS,TransOut3);
%transform(Trans4,REM,TransOut4);
我正在考虑在我的代码中结合使用循环和扫描,但我不知道如何在变量名中使用索引,所以我无法测试我的想法。无法运行的示例代码。
%let second= BBB, AAA, VCS,REM;
%macro trans;
%do i=1 %to 4;
%transform(Trans(i)?,%scan(&second.,&i),TransOut(i);
%end;
%mend;
我在下面发布了一些测试代码:
%macro test(data, var);
Data &data.;
Fname= "John";
Phone= 123;
City="Chicago";
Zip=65456;
keep &var.;
Run;
%mend;
%test(test1, Phone);
%test(test2, Fname);
%test(test3, City);
%test(test4, Zip);
答案 0 :(得分:2)
你已经差不多了。 (最好不要在列表中留下逗号)。
%let second= BBB AAA VCS REM;
%macro trans;
%do i=1 %to 4;
%transform(Trans&i,%scan(&second.,&i),TransOut&i);
%end;
%mend;
如果您正在处理长列表,则应考虑使用call execute:
data init;
input index userDef $;
datalines;
1 AAA
2 BBB
3 VCS
4 REM
;
run;
data _null_;
set init;
call execute(
cats(
'%transform(Trans', index, ',', userDef, ',TransOut', index,')'
)
);
run;
编辑:现在使用猫,正如乔
所建议的那样答案 1 :(得分:0)
除了Jetzler的回答之外,请注意,根据具体情况,在宏中包含循环可能更容易:
%let trans = trans1 trans2 trans3 trans4;
%let trips = aaa bbb rem vcs;
%let outs = transout1 transout2 transout3 transout4;
%macro transform;
%do i = 1 %to %sysfunc(countw(&trans.));
%do j = 1 %to %sysfunc(countw(&trips.));
%do k = 1 %to %sysfunc(countw(&outs.));
/*your code here*/
%end;
%end;
%end;
%mend transform;
%transform;