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=, VARLEN= );
    /*-----------------------------------------------------------------------
       DS     =   対象のデータセット ,
       WH    =   WHERE条件 ,
       VAR   =   引っ張ってくる変数
       VARLEN   =   引っ張ってくる変数に設定するLENGTH
   -----------------------------------------------------------------------*/

   %local  _index;
   %let  _index = &sysindex;

   _runobs&_index + 1;
   drop _runobs&_index;

   if _runobs&_index = 1 then do;
      length &VAR &VARLEN;
      dcl hash _hash&_index( dataset:"&DS( where = (" || %sysfunc(quote(&WH)) || "))", duplicate:"e" );
      _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;

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

   length SAFFL $1.;
   SAFFL = QVAL;
run;



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



0 件のコメント:

コメントを投稿