欢迎光临散文网 会员登陆 & 注册

比较 merge by 与 proc sql 的外连接(一)

2021-08-31 00:12 作者:陆震同学  | 我要投稿

回来得比较晚。我们讲个内容少点的 topic --- 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 内连接。

今天只能写到这了,我们后面再讲这个对比系列。

比较 merge by 与 proc sql 的外连接(一)的评论 (共 条)

分享到微博请遵守国家法律