2016年6月29日水曜日

BY値繰り返しのマージを活用する。


↓前回の続きです。
「MERGEステートメントにBY値を繰り返すデータセットが複数あります。」 とログに出たとき、どんなマージがされているのか。


今回は、BY値を繰り返すMERGEの活用例を紹介します。

例えば製薬業界だと、治験とかで症例の一覧を作成したりしますが、そういった時に使えます。




data DT1;
input NO$ SEX:$10. AGE ;
cards;
001 男 25
002 女 30
;

data DT2;
input NO$ KIO:$200. ;
cards;
001 aaa
001 bbb
001 ccc
002 ddd
002 eee
;

data DT3;
input NO$ GAP:$200. ;
cards;
001 AAA
001 BBB
002 CCC
002 DDD
;

DT1
NO
 SEX  
 AGE  
  001     男    25  
  002     女  30   

DT2
NO
 KIO  
  001     aaa   
  001     bbb
  001     ccc
  002     ddd
  002     eee

DT3
NO
 GAP  
  001     AAA   
  001     BBB
  002     CCC
  002     DDD


上記3つのデータセットをNOをキーにマージして、最終的に以下のような形でEXCELの一覧を作りたいとします。










普通にMERGEすると、、

data OUT1;
   merge DT1 DT2 DT3;
   by NO;
run;


望み通りの形になりません(上記の黄色部分を欠損値にしたい)

厄介なのが、DT2とDT3による多対多のマージにより、BY値の繰り返しが起きて、上記3オブザベーション目のGAPにも値が引き伸ばされてしまっている点。




そこで以下で紹介したテクニックで値が引き伸ばされないようにすると、、
「OUTPUT」と「CALL MISSING」のコンボ技

data OUT1;
   merge DT1 DT2 DT3;
   by NO;
   output;
   call missing(of _all_);
run;


大体、望み通りの形になります。

BY変数にしているNOも繰り返し表示されないように、以下青字のような文を追加すれば完成です。
data OUT1;
   length _NO $10.;

   merge DT1 DT2 DT3;
   by NO;

   if first.NO then _NO=NO;

   output;
   call missing(of _all_);
run;

あとはこれをEXCELにペタっと貼れば完成です。


📝注意

今回のテクニックで使用している「FIRST.BY変数」は「サブセット化IF」と一緒に使用すると正しく動かなくなりやすいです。


0 件のコメント:

コメントを投稿