[英]Difference in NA/NULL treatment using dplyr::left_join (R lang) vs. SQL LEFT JOIN
我想离开连接两个数据帧,其中两侧的连接列中可能有NA
(即两个code
列)
a <- data.frame(code=c(1,2,NA))
b <- data.frame(code=c(1,2,NA, NA), name=LETTERS[1:4])
使用dplyr
,我们得到:
left_join(a, b, by="code")
code name
1 1 A
2 2 B
3 NA C
4 NA D
使用SQL,我们得到:
CREATE TABLE a (code INT);
INSERT INTO a VALUES (1),(2),(NULL);
CREATE TABLE b (code INT, name VARCHAR);
INSERT INTO b VALUES (1, 'A'),(2, 'B'),(NULL, 'C'), (NULL, 'D');
SELECT * FROM a LEFT JOIN b USING (code);
似乎dplyr
连接不会将NA
视为SQL NULL
值。
dplyr
以与SQL相同的方式运行? PS。 当然,我可以首先删除left_join(a, na.omit(b), by="code")
以获得left_join(a, na.omit(b), by="code")
,但这不是我的问题。
在SQL中,“null”不匹配,因为SQL没有关于它应该连接到什么的信息 - 因此在连接的数据集中产生“null”,就像在没有匹配的情况下执行左外连接一样。正确的数据集。
然而,在R中,当涉及到连接时“NA”的默认行为几乎将其视为数据点(例如,空操作符),因此“NA”将匹配“NA”。 例如,
> match(NA, NA)
[1] 1
你可以绕过这种方法的一种方法是使用基本合并方法,
> merge(a, b, by="code", all.x=TRUE, incomparables=NA)
code name
1 1 A
2 2 B
3 NA <NA>
这里的“不兼容”参数允许您定义无法匹配的值,并且实质上强制R以SQL处理“null”的方式处理“NA”。 它看起来不像在left_join中实现了不兼容的功能,但它可能只是以不同的方式命名。
默认情况下,列代码具有主键,因此不接受NULL值
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.