CALL EXECUTEで、マクロループみたいなことを平コードで実現する_条件に合致するデータセットに対して処理を掛ける例

CALL EXECUTEというと、データステップ内で発生した値をマクロの引数にして実行する時によく使う機能でマクロとセットで捉われがちですが、
本来、CALL EXECUTEの引数を必ずマクロ化した処理にしなければならないわけではありません。


例えば今、以下のようにDS1,DS2,DS3,DS4と適当なデータセットが4つあったとします。

data DS1;
 do X=1 to 10;
  output;
 end;
run;
data DS2;
 do X=10 to 20;
  output;
 end;
run;
data DS3;
 do X=20 to 30;
  output;
 end;
run;
data DS4;
 do X=30 to 40;
  output;
 end;
run;

そして、以下のLISTというデータセットがあったとします

data LIST;
 DSNAME='DS1';FLAG='Y';output;
 DSNAME='DS2';FLAG='N';output;
 DSNAME='DS3';FLAG='N';output;
 DSNAME='DS4';FLAG='Y';output;
run;







FLAG変数がYとなっているDSNAMEのデータセットに対して
要約統計量の入ったデータセットを作成したいとします。

その場合、以下のようにLISTをデータステップでsetし
ifステートメント後にcall executeで、実行したい処理を文字列として記述します。
処理の引数にしたい部分は、データステップの変数なのでコーテーションでくるまないように
気をつけます。

data _NULL_;
 set LIST;
 if FLAG='Y' then
 call execute("proc summary data="||DSNAME||";
               var X;
               output out="||DSNAME||"_RESULT;
               run;");
run;

これで実行するとDS1とDS4に対してのみproc summaryが実行され
DS1_RESULTとDS4_RESULTが作成されます。





















もし、マクロ化してからcall executeするのであれば以下の感じでしょうか。

%macro m_d(ds);
  proc summary data=&ds.;
   var X;
   output out=&ds._RESULT;
  run;
 %mend m_d;

 data _NULL_;
  set LIST;
  if FLAG='Y' then
  call execute('%m_d('||DSNAME||')');
 run;

0 件のコメント:

コメントを投稿