2016年5月17日火曜日

データステップ内でプロシジャを実行する。



SASで遊んでる時に作ったマクロを自己満足のために載せたいと思います。


データステップ内でSUMMARYプロシジャ実行して、好きな統計量を変数に落とすマクロです。
以下「僕の頁」で紹介されているDOSUBL(SAS9.3以上)とFETCHOBSを使いました。

dosubl関数(call executeの兄弟)
fetchobs関数

*** マクロ登録 ;
%macro m_summary( ds, var, stat, newvar );
************************************;
* ds       … 対象データセット ;
* var      … 対象変数 ;
* stat     … 統計量キーワード ;
* newvar … 結果を格納する変数 ;
************************************;

   *** SUMMARYプロシジャを実行 ;
   _rc = dosubl("

       proc summary data=&ds;
          output out=_sumout1 &stat(&var)=_mvar1;
       run;

   ");

   *** 結果を取得 ;
   length _mvar1 8.;
   _mvar1=.;

   _dsid = open("_sumout1(keep=_mvar1)") ;
   call set(_dsid);
   _rc = fetchobs(_dsid,1);
   _rc = close(_dsid);

   &newvar = _mvar1;

   *** マクロ内で作った一時変数を削除 ;
   drop _rc _dsid _mvar1;

%mend;



*** データステップ内でマクロを実行してみる ;
data dt1;
   length avg_age avg_hei 8.;
   %m_summary( sashelp.class, age, mean, avg_age );
   %m_summary( sashelp.class, height, mean, avg_hei );
run;
 avg_age
avg_hei
 13.315789474  
  62.336842105 

※本マクロは粗削りな部分があるので、ご利用される場合は、マクロの内容を理解頂いて、適宜中身を修正ください。


ポイント
以下「データステップ100万回」で紹介されている通り、
マクロ変数に数値をいれると、元の値と誤差がでる事があるので、結果を取得する部分ではマクロ機能の使用を避けて、OPEN, FETCHOBS関数を使用してみました。

マクロ変数に数値をいれて戻すと誤差がでちゃう場合がある問題について考える話



以下につづく
【%LET Y=%X】 みたいに書いて指定変数の統計量をマクロ変数に直接格納する方法


0 件のコメント:

コメントを投稿