SAS循环遍历宏变量列表

时间:2017-05-31 15:03:49

标签: macros sas

首先,我是新人,所以如果这不是一个好问题我道歉。我搜索但没有发现类似的东西。我不确定我的方法是否正确,所以我们将不胜感激。

我正在研究一个有学期的学校数据集,例如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个组合在一起?

我不能只在数据步骤中输入所有感兴趣的术语,因为有些术语在它们之间有重复数据,需要单独处理。试图将所有术语放在数据步骤中对我来说没有用,所以我想通过分别为每个学期运行整个程序来使它们分开。

1 个答案:

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