ラベル IN= の投稿を表示しています。 すべての投稿を表示
ラベル IN= の投稿を表示しています。 すべての投稿を表示

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;


2014年3月1日土曜日

IN=オプションとWHICHN関数のコンボ技。




ちょっとしたコンボ技を紹介。

複数のデータセットをSETして1つにまとめた時、
どのデータセットから持ってきたレコードなのか識別するために由来コードを振ることがあって、そういった時に使えます。


サンプルデータ作成

data DT1;
  do V=1 to 2;
     output;
  end;
run;

data DT2;
  do V=3 to 4;
     output;
  end;
run;

データセット「DT1」
V
1
2

データセット「DT2」
V
3
4




コンボ技

上記データセットを縦結合して、
・「DT1」由来のレコードであれば「ORIGIN=1」
・「DT2」由来のレコードであれば「ORIGIN=2」
というコードの変数を作りたいとします。

求めたい結果
V   ORIGIN
1      1
2      1
3      2
4      2



最近までこんな感じで書いてましたが、、
data OUT2;
   set DT1 (in=_IN1)
         DT2 (in=_IN2)
   ;
   if  _IN1=1 then ORIGIN = 1;
   if  _IN2=1 then ORIGIN = 2;
run;



WHICHN関数を組み合わせると、以下のように書けます。
data OUT2;
   set DT1 (in=_IN1)
         DT2 (in=_IN2)
   ;
   ORIGIN = whichn(1,_IN1, _IN2) ;
run;

結合するデータセットがいくつあっても1文で書けちゃうので楽。


WHICHN関数の構文は「whichn(Y, X1,X2…)」で、Yと同じ値がXの何番目に初登場するか返してくれます。
・YとXは数値型の変数または値である必要があります
・Yと同じ値がXにない場合、0が返される
・Yが欠損値の場合、欠損値が返される