いずれかn個のデータセットにキー値が存在する場合のみ結合結果を残すMERGE

たとえば以下の3つのデータセットがあったとします。

【データセット Q1】
data Q1;
 A=1;B='い';output;
 A=2;B='ろ';output;
 A=3;B='は';output;
 A=4;B='に';output;
 A=5;B='ほ';output;
run;
proc sort;
 by A;
run;









【データセット Q2】
data Q2;
 A=3;C='へ';output;
 A=4;C='と';output;
 A=6;C='ち';output;
run;
proc sort;
 by A;
run;



【データセット Q3】
data Q3;
 A=1;D='り';output;
 A=3;D='ぬ';output;
 A=7;D='る';output;
run;
proc sort;
 by A;
run;







これを変数Aでマージするとき、2つのデータセットにキーが存在する場合のみマージ結果を残したいとします。

つまりA=3はQ1 Q2 Q3全てのデータセットに存在するので、対象外です。
またA=2,6,7などは1つのデータセットにしか存在しないのでこれも対象外です。
さて、どうしましょうか?


data A1;
 merge Q1(in=in1)
       Q2(in=in2)
       Q3(in=in3)
       ;
    by A;
    if in1+in2+in3=2;
run;







なんのことはないですね、上記のコードで詰みです。
in=では、そのデータセットからオブザベーションが読み込まれる時に1の値が格納されるので
足し算して2になるオブザベーションのみ残せばいいわけです。

簡単な問題ですが、in=で格納される1の値を計算式に利用して抽出するという考え方は役にたちます。
例えば実践例はあまりありませんが、
 if in1+in2*2+in3=2;
のように一部のデータセットから読み込まれる場合に重みをつけることで
特殊な条件での結合も表現できるのではないでしょうか?


0 件のコメント:

コメントを投稿