【问题标题】:SAS Loop through list of macro variableSAS循环遍历宏变量列表
【发布时间】:2017-11-01 11:10:56
【问题描述】:

首先,我是新手,如果这不是一个好问题,我深表歉意。我搜索但没有找到类似的东西。我不确定我的方法是否正确,因此我们将不胜感激。

我正在为具有学期的学校处理数据集,例如 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 个集合附加在一起?

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

【问题讨论】:

  • stackoverflow.com/questions/18667379/… 的副本。该问题要求 PROC SQL,但可以轻松替换数据步骤。
  • 对不起,我不明白这是同一个问题。他只有一个程序。我有几个数据步骤(总共 12 个),其中一些使用宏变量。我不想对每个数据步骤进行更改。应该有一种方法可以用顶部的宏变量指定的不同学期运行整个程序。
  • @elfrozo 是一样的,因为答案是一样的:将它包装在一个宏中,然后循环整个事情。您不必更改任何数据步骤。
  • @Joe,谢谢。你是对的,它也可以这样工作,而且会更简单。我现在正在阅读:www2.sas.com/proceedings/forum2007/183-2007.pdf

标签: macros sas


【解决方案1】:

只需将您现有的代码包装在一个宏中,然后让该宏遍历值列表即可。有关另一个示例,请参见另一个问题: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)

【讨论】:

  • 非常感谢。这是有道理的,我现在知道该怎么做。你的代码非常适合我。
猜你喜欢
  • 2017-10-31
  • 1970-01-01
  • 1970-01-01
  • 2016-02-05
  • 2020-07-08
  • 1970-01-01
  • 2016-05-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多