で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 件のコメント:
コメントを投稿