2016年9月21日水曜日

SETやMERGEをした時、オブザベーション毎に結合元のデータセットがどれなのか判別する方法 【IN=オプション】



SETやMERGEで使えるIN=オプションについて解説をしたいと思います。



構文

SET   データセット1  ( IN = 一時変数1 )
          データセット2  ( IN = 一時変数2 )

          ・・・
;


・ データセット1 から持ってきたオブザベーションの場合「1」、それ以外「0」が 一時変数1 に入る
・ データセット2 から持ってきたオブザベーションの場合「1」、それ以外「0」が 一時変数2 に入る

・ 一時変数名は適当な名前でOK。またこの一時変数は出力データセットには残らない。







サンプルデータ作成
data DT1;
   length A 8. B $10.;
   A=1; B="aa"; output;
   A=2; B="bb"; output;
run;
  A  
  B  
  1 aa
  2 bb

data DT2;
   length A 8. C $10.;
   A=2; C="cc"; output;

   A=3; C="dd"; output;
run;
  A  
  C  
  2 cc
  3 dd


例① SETステートメントでの例
data OUT1;
  set  DT1 (in=FLG1)   DT2 (in=FLG2) ;

  /* 別の変数に格納してデータセットに残す */
  X = FLG1;
  Y = FLG2;
run;
  A  
  B  
  C  
  X  
  Y  
  1 aa  1  0
  2 bb
  1  0
  2 cc  0  1
  3 dd  0  1



例② MERGEステートメントでの例
data OUT2;
  merge  DT1 (in=FLG1)   DT2 (in=FLG2) ;
  by A;

  /* 別の変数に格納してデータセットに残す */
  X = FLG1;
  Y = FLG2;
run;
  A  
  B  
  C  
  X  
  Y  
  1 aa  1  0
  2 bb cc  1  1
  3 dd  0  1




実践例

上の例②で、DT1とDT2の両方に存在するBY値のオブザベーションを特定したい場合、以下の条件を書けばいい事が分かりますね。

if FLG1=1 and FLG2=1 then COMMON_FLG=1;


また、DT1になくて、DT2にのみ存在するBY値のオブザベーションを特定したい場合、以下の条件を書けばいけますね。

if FLG1=0 and FLG2=1 then DT2ONLY_FLG=1;


0 件のコメント:

コメントを投稿