我想离开加入两个数据框,两边的连接列中可能有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。当然,我可以先删除NAs到达那里left_join(a, na.omit(b), by="code")
,但这不是我的问题。
答案 0 :(得分:3)
在SQL中,&#34; null&#34;什么都不匹配,因为SQL没有关于它应该连接到什么的信息 - 因此在你的连接数据集中得到的&#34; null&#34;就像在右边没有匹配的情况下执行左外连接一样数据集。
然而,在R中,&#34; NA&#34;的默认行为当谈到连接几乎就像把它当作一个数据点(例如一个空操作符),所以&#34; NA&#34;会匹配&#34; NA&#34;。例如,
> 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>
&#34;不兼容&#34;这里的参数允许你定义不能匹配的值,并且基本上迫使R来处理&#34; NA&#34; SQL处理&#34; null&#34;的方式。看起来似乎不兼容的功能在left_join中实现,但它的名称可能不同。
答案 1 :(得分:0)
默认情况下,列代码具有主键,因此不接受NULL值