SAS代码,循环索引等,如何简化

时间:2016-04-04 13:54:49

标签: 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);

我正在考虑在我的代码中结合使用循环和扫描,但我不知道如何在变量名中使用索引,所以我无法测试我的想法。无法运行的示例代码。

%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);

2 个答案:

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