データステップの外側のテーブルをループするSASの方法
Dec 02 2020
たとえば、テーブルからファイルを読み込んで、各ファイルに対して複雑な分析を行うために、データステップの外側でデータテーブルに対してマクロループを実行する最もクリーンな方法は何でしょうか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ステートメント:セル値を参照しますか?
回答
3 Tom Dec 02 2020 at 20:46
したがって、入力パラメーターFILENAMEおよびPURPOSEを使用してマクロ名ANALYSISを定義した場合。
%macro analysis(filename,purpose);
/* Here comes the actual analysis */
title &purpose ;
proc import datafile="&filename" ....
%mend;
次に、データステップを使用して、観測ごとにマクロへの1つの呼び出しを生成できます。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;