macros - SAS循环遍历宏变量列表

标签 macros sas

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

我正在为一个有学期的学校处理数据集,例如 2017SP 是 2017 年 Spring ,2017SU 是 2017 年夏季,依此类推。

我有以下程序,我在顶部设置了一个宏变量,然后使用它从各种库和数据集中提取术语。请注意,我有几个数据步骤,只需要运行整个程序 5 次以上。

%let STC_TERM=2017SU;

数据步骤; 集合(拥有所有术语数据的图书馆); 如果 STC_TERM = "&STC_TERM"; *我想做的其他事情* 运行; 我的程序中还有其他几个类似的数据步骤,它们最终为我提供了我想要的输出数据。

现在我需要创建一个数据集,其中五个学期的数据相互附加。

而不是运行我的代码 5 次,只是更改“%let STC_TERM=2017SU;”到 “%let STC_TERM=2016SU;”对于我想要的每一年,我都希望能够以某种方式提供我的 5 个术语列表,并让 SAS 循环遍历这 5 个术语中的每一个并将结果附加在一起。

五个术语是(2017SU、2016SU、2015SU、2014SU、2013SU)。

有没有办法将此列表提供给我的程序,让它首先在 2017SU 上执行所有数据步骤,然后在下学期执行,依此类推,并将生成的 5 组数据附加在一起?

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

最佳答案

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

关于macros - SAS循环遍历宏变量列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44288284/

相关文章:

macros - 为什么在这个宏定义中需要@符号?

powershell - 具有参数/参数的Powershell

sas - 使用 SAS 在表中创建所有可能的组合

assembly - 在 AArch64 的 GNU 汇编程序中打破长宏参数列表

c - C 中的内核模块 __init 宏

c++ - 宏是否分配内存?

sas - 在sas中设置具有相似名称的多个数据集

sas - 不带左修剪的数据步骤中从文件输入

在 R 或 SAS 中重新定义和合并两个表

merge - 根据查找表中的值创建 SAS 变量