在数据步外循环 table 的 SAS 方法

The SAS way to loop over a table outside a data step

我想知道如何在数据 table 外部 数据步骤上执行宏循环的最干净的方法是什么,例如从 table have 中读取文件并对每个文件进行一些复杂的分析。

假设我们有一个 table have 包含一组文件名和其他元数据:

N  filename  purpose
1  foo.xls   Blue team data
2  bar.xls   Read team data

我在想

%local lines current_file current_purpose;

proc sql noprint;
   select count(*) into: lines from have;
quit;

%do I=1 %to &lines.;
   %put --- Process file number &I. ---;
   data _null_;
      set have;
      if _n_=&I. then do;
        call symput('current_file',filename);
        call symput('current_purpose',purpose);
      end;
   run;
   %put --- &current_file. contains &purpose.;
   /* Here comes the actual analysis */ 
%end;

请问这是怎么做到的呢?对我来说,这看起来不是最简单的方法。

相关问题:

因此,如果您使用输入参数 FILENAME 和 PURPOSE 定义了一个名为 ANALYSIS 的宏。

%macro analysis(filename,purpose);
  /* Here comes the actual analysis */ 
  title &purpose ;
  proc import datafile="&filename" ....
%mend;

然后您可以使用数据步骤为每个观察生成一次对宏的调用。您可以使用 CALL EXECUTE,但我发现将代码写入文件然后 %INCLUDE 更清晰、更容易调试。特别是当参数名称与用于驱动代码生成的元数据中的变量名称匹配时。

所以这一步:

filename code temp;
data _null_;
   set have;
   file code;
   put '%analysis(' filename= ',' purpose= :$quote. ')' ;
run;

将生成如下程序:

%analysis(filename=foo.xls,purpose="Blue team data")
%analysis(filename=bar.xls,purpose="Red team data")

然后您可以 运行 使用

%include code / source2;