比较 merge by 与 proc sql 的外连接(一)
左连接。
为了让大家时刻对外连接不迷糊,咱们约定一下,以后外连接,咱们统一叫成外连接横向匹配合并。如此一来,我相信,你不会有突然对外连接感到陌生的时刻。
外连接横向匹配合并,即左连接、右连接及全连接横向匹配合并。时间紧张,我们今天先讲第一部分---左连接横向匹配合并。
先上二者的“完全等效” code(之所以打引号,后面会解释):
准备数据集
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;

左连接横向匹配合并
一句话,以左侧数据集中某一(些)变量作为 key variable(s) 进行数据集间的横向连接,输出数据集中 key variable(s) 的取值跟着左侧数据集的对应变量的取值走。
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。上面的输出数据集是没问题的,以 A 中 id 作为 left join 的 key variable,同时搜索 B 中有相同 id 取值的行,进行左连接横向匹配合并。A 中无 weight 变量,故 A 的部分观测的 weight 为缺失。
merge by
Data dummy;
Merge A(IN= X) B(IN= Y);
by ID;
If X;
run;
proc print; run;
输出数据集完全一样,从结果上来看,二者等效。
细节
然而,你留意看 SAS log 的话,proc sql 会有这样的 warning,而 merge by 就不会有这个 warning。
这提示你两种 code 虽然结果一样,但是逻辑并不完全等价:

注意,merge by 是针对 by vairable(s) 进行左连接横向匹配合并。什么意思?merge by 是在两个数据集 by vairable(s) 的全部值的组合列表上进行连接,以数据集选项 in 控制左连接 or 右连接 or 全连接 or 内连接。