今回は製薬業界でのお話になります。
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; 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 ) |
データステップ中に、SUPPDM.QNAM="SAFFL"の時のQVALを取得しています。
このマクロはシンプルで十分使えますが、もっと作りこめば、最強マクロにもなり得ます。