2018年7月27日金曜日

Hashオブジェクトは、CDISCに係るSASプログラミングと相性バッチリ




今回は製薬業界でのお話になります。


CDISC関連のSASプログラミング(SDTMやADaMのデータセット作成)では、よく以下のような変数を導出します。

・他のデータセットから変数値を取得
・他のデータセットに条件に合うレコードが存在する場合「Y」、 のようなフラグ変数の導出
・他のデータセットの特定レコードの最小値・最大値・合計・カウントなどの取得

これらは通常、SQL, MEANS, FREQ, TRANSPOSE, DATAステップ等を組み合わせて導出するんですが、Hashオブジェクトを使うと、すべてまとめて1回のDATAステップで導出する事も可能です。



(Hashオブジェクトがどんなものか知りたい方はデータステップ100万回のSASYAMAさんが詳しく解説をされてるので、そちらをご覧ください)

ハッシュオブジェクトの世界① (データステップ100万回)
http://sas-tumesas.blogspot.com/2014/07/blog-post_11.html




今回は、CDISC対応でのHashオブジェクトの利用例を紹介します。
以下は変数USUBJIDをキーに、他のデータセットから条件に合うレコードの変数を引っ張ってくるマクロです。

%macro m_find( DS= , WH=, VAR= );
     /*-----------------------------------------------------------------------
         DS     =   対象のデータセット ,
         WH    =   WHERE条件 ,
         VAR   =   引っ張ってくる変数
     -----------------------------------------------------------------------*/

     %local  _index;
     %let  _index = &sysindex;

     _runobs&_index + 1;
     drop _runobs&_index;

     if _runobs&_index = 1 then do;
            if 0 then set &DS ( keep=&VAR );
            dcl hash _hash&_index( dataset : "&DS( where = (" || %sysfunc(quote(&WH)) || "))" );
            _hash&_index..definekey( "USUBJID" );
            _hash&_index..definedata( "&VAR" );
            _hash&_index..definedone();
     end;

     if _hash&_index..find() ^= 0 then call missing( &VAR );
%mend;




ではマクロの使用例も見てみましょう。

* 適当なサンプルデータ ;
data DM;
   USUBJID = "001";
run;





data SUPPDM;
    USUBJID = "001";  QNAM = "SAFFL";  QVAL = "Y";
    output;

    USUBJID = "001";  QNAM = "FASFL";  QVAL = "Y";
    output;
run;








* マクロ使用例 ;
data ADSL;
      set DM;
      length SAFFL $1.;

      *** SAFFL ******;
      %m_find( ds=SUPPDM, wh=QNAM="SAFFL", var=QVAL )
      SAFFL = QVAL;
run;



データステップ中に、SUPPDM.QNAM="SAFFL"の時のQVALを取得しています。
このマクロはシンプルで十分使えますが、もっと作りこめば、最強マクロにもなり得ます。



0 件のコメント:

コメントを投稿