使用dplyr :: left_join(R lang)与SQL LEFT JOIN

时间:2016-10-18 09:54:46

标签: sql r left-join dplyr

我想离开加入两个数据框,两边的连接列中可能有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);

enter image description here

似乎dplyr加入不会将NA视为SQL NULL值。

  1. 有没有办法让dplyr的行为方式与SQL相同?
  2. 这种NA治疗背后的理由是什么?
  3. PS。当然,我可以先删除NAs到达那里left_join(a, na.omit(b), by="code"),但这不是我的问题。

2 个答案:

答案 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值