データステップの外側のテーブルをループする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 --- &current_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;