Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops SAS代码、循环索引等,如何简化_Loops_Sas - Fatal编程技术网

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

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); 我想在我的代码中结

我有下面的SAS代码,然后可以运行。挑战是我不得不重复这么多次,看起来真的很尴尬。我需要Trans1-Tran2,TransOut1-TransOut100,BBB,AAA,VCS是用户定义的,没有趋势可循

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