データステップでインデックスを利用して結合を行う。Setステートメントとkey=オプション、そして自動変数_IORC_を使って

SASでインデックスを使うなら、やっぱりデータステップで活かしてみたいですよね。
でkey=データセットオプションと_IORC_の話なのですが、とっつきにくそうに見えて、実は単純な原理なので、マニアックな話だと思わずに、見てみてください。

今、以下の2つのデータセットがあったとします。

data Q1;
do X=1 to 10;
 do Y='A','B','C';
  output;
 end;
end;
run;




























data Q2(index=(XY=(X Y)));
 X=1;Y='C';Z=100;output;
 X=6;Y='A';Z=200;output;
 X=8;Y='B';Z=300;output;
 X=9;Y='D';Z=400;output;
run;








で、結論からいうとSET データセット名 key=結合に使うインデックス名;
で、事前にソートされていないデータセットについて結合を行うことができます。
(ソートが必要ないのは、順番にobsを読み込むのではなくインデックスを見てダイレクトアクセス
するためです)

data A2;
 set Q1;
 set Q2 key=XY;
run;

として実行します。
すると、結果は









































となります。
よく見ると、マッチングできたオブザベーションの値が、マッチできてないobsに
覆いかぶさるように引き延ばされているのがわかると思います。
通常、こんな結果は欲しくないはずです。

さらにログがえらいことになります。


































ようするに、値がとってこれないということがエラーになっているのですね。

で、_IORC_とかって文字がでていますが、これは何だということです。
正体を現せということで、以下のコードを実行します。

data A3;
 set Q1;
 set Q2 key=XY;
 A=_IORC_;
 E=_ERROR_;
run;

あいかわらずログは変わらずですが、データセットの中身をみてみると











































とりあえず、わかることは_IORC_は結合がうまくいった箇所では0で、そうでない場所では
わけわからん数字になっていて、_ERROR_もたつということです。
ちなみに_ERROR_が1になるということはログにERROR:がでるということです。

実はIORCとはInput Output Return Codeの略で、インデックスによるキーマッチングを
行った際のエラーコードを返してくれるのです。そのエラーの種類によっていろんな数字になる
そうで、とりあえず、今回を見る限り、ルックアップデータセットに対応するインデックスが
ない場合は1230015というエラーコードになるようですね。
成功すれば必ず0になるわけです。

なるほど、ここまでわかればもう充分!要は_IORC_が0かそれ以外かで、ちょちょいと分岐すれば
思い通りにできるということです。


まずは、キーが一致したオブザベーションのみを残す、いわいる内部結合の表現

data A4;
 set Q1;
 set Q2 key=XY;
 if _IORC_=0 then output;
 else _ERROR_=0;
run;

なんて、シンプル!0なら出力して違うなら、しない、違う場合は_ERROR_=1のままにしとくと
ログがうざいので_ERROR_を0で封じるということです。
結果は






ログも










綺麗。



じゃあ、次は外部結合です。Q1のobsを全部残しつつ、キーが一致するQ2の値をつなげる処理。

data A5;
 set Q1;
 set Q2 key=XY;
 if _IORC_^=0 then do;
  Z=.;
  _ERROR_=0;
 end;
run;

もうわかりますね、引き延ばしを抑制しているわけです。

























今回はとてもシンプルな例のみ説明しましたが、
_IORC_をうまく使うと色々もっとできます。
僕も勉強中なので、より極めたい方は海外の論文をあたれば、山ほどでてきます。





0 件のコメント:

コメントを投稿