【データセット 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 件のコメント:
コメントを投稿