我想知道如何在数据步骤之外的数据表上执行宏循环,例如从表have
读取文件并对每个文件进行一些复杂的分析,最干净的方法是什么。
假设我们有一个表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 --- ¤t_file. contains &purpose.;
/* Here comes the actual analysis */
%end;
这是怎么做的吗?对我来说,这似乎不是最简单的方式。
相关问题:
- SAS循环通过数据集
- SAS let语句:引用单元格值
因此,如果您使用输入参数FILENAME和PURPOSE定义了宏名称ANALYS。
%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;