ラベル 関数: FETCHOBS の投稿を表示しています。 すべての投稿を表示
ラベル 関数: FETCHOBS の投稿を表示しています。 すべての投稿を表示

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】 みたいに書いて指定変数の統計量をマクロ変数に直接格納する方法


2016年2月24日水曜日

「CALL SET」「FETCHOBS」等で、全変数まとめてマクロ変数に格納する。



全変数まとめて同名のマクロ変数に格納する、あまり知られていない方法。
(最後に注意点の記事リンクも貼っているのでそちらも要確認)





%macro TEST;

   * データセットOPEN ;
   %let _DSID = %sysfunc(open( SASHELP.CLASS ));

   * 変数と同名のマクロ変数をリンクさせる ;
   %syscall set( _DSID );

   * OBSの数だけループ ;
   %do _i = 1 %to %sysfunc(attrn( &_DSID, nlobsf ));

        * 1OBS内の全変数値を同名のマクロ変数に格納 ;
        %let _RC = %sysfunc(fetchobs( &_DSID, &_i ));

        * 格納値をログに出力してみる ;
        %put &NAME &SEX &AGE &HEIGHT &WEIGHT;

   %end;

   * データセットCLOSE ;
   %let _RC = %sysfunc(close( &_DSID ));

%mend;


%TEST;


ログ

ログにマクロ変数値が出力されてますね。


注意点

・数値をマクロ変数にいれると、丸められて元の値と異なる場合があるので注意。
マクロ変数に数値をいれて戻すと誤差がでちゃう場合がある問題について考える話(データステップ100万回)

・変数値を格納したマクロ変数の名前が、一時的に作ったマクロ変数の名前(今回の例では「_DSID」「_i」「_RC」)と被らないように気をつけてくださいね。



関連記事

変数値をマクロ変数に格納する方法「CALL SYMPUTX編」