Loops SAS代码、循环索引等,如何简化
我有下面的SAS代码,然后可以运行。挑战是我不得不重复这么多次,看起来真的很尴尬。我需要Trans1-Tran2,TransOut1-TransOut100,BBB,AAA,VCS是用户定义的,没有趋势可循Loops SAS代码、循环索引等,如何简化,loops,sas,Loops,Sas,我有下面的SAS代码,然后可以运行。挑战是我不得不重复这么多次,看起来真的很尴尬。我需要Trans1-Tran2,TransOut1-TransOut100,BBB,AAA,VCS是用户定义的,没有趋势可循 %transform(Trans1,BBB,TransOut1); %transform(Trans2,AAA,TransOut2); %transform(Trans3,VCS,TransOut3); %transform(Trans4,REM,TransOut4); 我想在我的代码中结
%transform(Trans1,BBB,TransOut1);
%transform(Trans2,AAA,TransOut2);
%transform(Trans3,VCS,TransOut3);
%transform(Trans4,REM,TransOut4);
我想在我的代码中结合do循环和Scan,但我不知道如何在变量名中使用index,所以我无法测试我的想法。无法运行的示例代码
%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);
你几乎已经做对了。 (最好在列表中省去逗号)
如果您处理的是长列表,则应该考虑使用CaldExc:
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;
编辑:现在使用CAT,正如Joe所建议的,除了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;
cats
比所有压缩函数和|
运算符更适合实际调用执行,但在其他方面这是好的。是的,您的理由是正确的。我将相应地编辑代码。
%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;