繁体   English   中英

使用dplyr :: left_join(R lang)与SQL LEFT JOIN进行NA / NULL处理的区别

[英]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值。

  1. 有没有办法让dplyr以与SQL相同的方式运行?
  2. 这种NA治疗背后的理由是什么?

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM