2017-05-31 546 views
1

首先,我是新的,所以如果这不是一个好问题,我很抱歉。我搜查了但没有发现类似的东西。我不确定我的方法是否正确,因此我们将不胜感激。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;”到 “%let STC_TERM = 2016SU;”对于我想要的每一年,我都希望能够提供5个术语的列表,并通过5个术语中的每一个让SAS循环,并将结果附加在一起。

五个条款是(2017年,2016年,2015年,2014年,2013年)。

有没有办法将这个清单给我的程序,让它在2017SU首先执行所有的数据步骤,然后在下一个学期等等,并将结果附加在一起?

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

+0

可能的复制https://stackoverflow.com/questions/18667379/simple-iteration-through-array-with-proc-sql-in-sas ) – DomPazz

+0

重复的https://stackoverflow.com/questions/18667379/simple-iteration-through-array-with-proc-sql-in-sas/18667497#18667497。那个问题是要求PROC SQL,但是数据步骤可以很容易地被替换。 – DomPazz

+0

对不起,我不明白这是同一个问题。他只有一个程序。我有几个数据步骤(共12个),其中一些使用宏变量。我不希望对每一个数据步骤进行更改。应该有一种方法来运行整个程序,使用顶部宏变量指定的不同学期。 – elfrozo

回答

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) 
[通过与SAS PROC SQL阵列简单迭代](的
+0

非常感谢你。这是有道理的,我现在知道如何去做。你的代码对我来说非常合适。 – elfrozo