首先,我是新人,所以如果这不是一个好问题我道歉。我搜索但没有发现类似的东西。我不确定我的方法是否正确,所以我们将不胜感激。
我正在研究一个有学期的学校数据集,例如2017SP是2017年春季,2017SU是2017年夏天等等。
我有以下程序,我在顶部设置一个宏变量,然后用它从各种库和数据集中提取该术语。请注意,我有几个数据步骤,只需要运行整个程序超过5次。
%let STC_TERM=2017SU;
Data Step;
set (library that has data on all terms);
if STC_TERM = "&STC_TERM";
*other things I want to do*
run;
我的程序中有几个其他类似的数据步骤,最终给出了我想要的输出数据。
现在我需要创建一个数据集,其中包含五个学期的数据,这些数据只是相互附加。
而不是运行我的代码5次而只是改变“%let STC_TERM = 2017SU;”至 “%让STC_TERM = 2016SU;”对于每一年我都希望我希望有一些提供我的5个术语的列表并且在5个术语中都有SAS循环并将结果附加在一起。
五个学期是(2017SU,2016SU,2015SU,2014SU,2013SU)。
有没有办法将这个列表提供给我的程序,并让它在2017SU首先执行所有数据步骤,然后在下一个学期继续执行,依此类推,将所得到的5个组合在一起?
我不能只在数据步骤中输入所有感兴趣的术语,因为有些术语在它们之间有重复数据,需要单独处理。试图将所有术语放在数据步骤中对我来说没有用,所以我想通过分别为每个学期运行整个程序来使它们分开。
答案 0 :(得分:3)
将现有代码包装在宏中,让宏遍历值列表。另请参阅另一个问题:Simple iteration through array with proc sql in SAS
如果您想将结果累积到单个表格中,请在代码末尾添加PROC APPEND步骤。
%macro do_all(termlist);
%local i stc_term ;
%do i=1 %to %sysfunc(countw(&termlist,%str( )));
%let STC_TERM=%scan(&termlist,&i,%str( ));
data step1;
set have ;
where STC_TERM = "&STC_TERM";
* ... other things I want to do in this step ... ;
run;
...
data step_last;
set stepX;
...
run;
proc append base=all data=step_last force ;
run;
%end;
%mend do_all;
然后用值列表调用它。
%do_all(2017SU 2016SU 2015SU 2014SU 2013SU)