首先,我是新人,所以如果这不是一个好问题,我深表歉意。我搜索过但没有找到类似的东西。我不确定我的方法是否正确,因此我们将不胜感激。
我正在为一所有学期的学校创建一个数据集,例如 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;”到
“%let STC_TERM=2016SU;”对于我想要的每一年,我都希望能够以某种方式提供我的 5 个术语列表,并让 SAS 循环遍历这 5 个术语中的每一个并将结果附加在一起。
这五个术语是(2017SU、2016SU、2015SU、2014SU、2013SU)。
有没有办法将此列表提供给我的程序,并让它首先在 2017SU 上执行所有数据步骤,然后在下学期依此类推,并将结果 5 组附加在一起?
我不能只将所有感兴趣的术语放入数据步骤中,因为某些术语之间有重复的数据,需要单独处理。尝试将所有术语放入数据步骤之前对我来说不起作用,因此我想通过每个学期单独运行整个程序来将它们分开。
只需将现有代码包装在宏中,然后让宏迭代值列表。请参阅另一个问题的另一个例子:在 SAS 中使用 proc sql 通过数组进行简单迭代 https://stackoverflow.com/questions/18667379/simple-iteration-through-array-with-proc-sql-in-sas/18667497#18667497
如果您想将结果累积到一个表中,请在代码末尾添加 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)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)