比較 merge by 與 proc sql 的外連接(一)
左連接。
為了讓大家時刻對外連接不迷糊,咱們約定一下,以后外連接,咱們統(tǒng)一叫成外連接橫向匹配合并。如此一來,我相信,你不會有突然對外連接感到陌生的時刻。
外連接橫向匹配合并,即左連接、右連接及全連接橫向匹配合并。時間緊張,我們今天先講第一部分---左連接橫向匹配合并。
先上二者的“完全等效” code(之所以打引號,后面會解釋):
準(zhǔn)備數(shù)據(jù)集
Data A;
? ?Input ID Name$ Height;
? ?cards;
1 A 1
3 B 2
5 C 2
7 D 2
9 E 2
? ?;
run;
Data B;
? ?Input ID Name$ Weight;
? ?cards;
2 A 2
4 B 3
5 C 4
7 D 5
? ?;
run;

左連接橫向匹配合并
一句話,以左側(cè)數(shù)據(jù)集中某一(些)變量作為 key variable(s) 進(jìn)行數(shù)據(jù)集間的橫向連接,輸出數(shù)據(jù)集中 key variable(s) 的取值跟著左側(cè)數(shù)據(jù)集的對應(yīng)變量的取值走。
proc sql
PROC SQL;
? ?Create table dummy as
? ?Select * from A as x left join B as y
? ? ? ?On x.ID= y.ID;
Quit;

坦白來講,同時給我 merge by 和 proc sql,我會選 sql。上面的輸出數(shù)據(jù)集是沒問題的,以 A 中 id 作為 left join 的 key variable,同時搜索 B 中有相同 id 取值的行,進(jìn)行左連接橫向匹配合并。A 中無 weight 變量,故 A 的部分觀測的 weight 為缺失。
merge by
Data dummy; ? ? ? ?
? ?Merge A(IN= X) B(IN= Y);
? ?by ID;
? ?If X;
run;
proc print; run;
輸出數(shù)據(jù)集完全一樣,從結(jié)果上來看,二者等效。
細(xì)節(jié)
然而,你留意看 SAS log 的話,proc sql 會有這樣的 warning,而 merge by 就不會有這個 warning。
這提示你兩種 code 雖然結(jié)果一樣,但是邏輯并不完全等價:

注意,merge by 是針對 by vairable(s) 進(jìn)行左連接橫向匹配合并。什么意思?merge by 是在兩個數(shù)據(jù)集 by vairable(s) 的全部值的組合列表上進(jìn)行連接,以數(shù)據(jù)集選項 in 控制左連接 or 右連接 or 全連接 or 內(nèi)連接。