r - merge.data.table with all=True 引入 NA 行。这样对吗?

标签 r data.table outer-join

在填充的 data.table 和另一个空的 data.table 之间进行合并会在结果 data.table 中引入一个 NA 行:

a = data.table(c=c(1,2),key='c')
b = data.table(c=3,key='c')
b=b[c!=3]
b
# Empty data.table (0 rows) of 1 col: c
merge(a,b,all=T)
#     c
# 1: NA
# 2:  1
# 3:  2

为什么?我预计它只会返回 data.table a 的行,就像merge.data.frame一样:
> merge.data.frame(a,b,all=T,by='c')
#  c
#1 1
#2 2

最佳答案

问题中的例子太简单了,无法说明问题,因此引起混淆和讨论。使用两个单列data.table s 不足以显示什么 merge做!

这是一个更好的例子:

> a = data.table(P=1:2,Q=3:4,key='P')
> b = data.table(P=2:3,R=5:6,key='P')
> a
   P Q
1: 1 3
2: 2 4
> b
   P R
1: 2 5
2: 3 6
> merge(a,b)  # correct
   P Q R
1: 2 4 5
> merge(a,b,all=TRUE)  # correct.  
   P  Q  R
1: 1  3 NA
2: 2  4  5
3: 3 NA  6
> merge(a,b[0],all=TRUE)  # incorrect result when y is empty, agreed
    P  Q  R
1: NA NA NA
2: NA NA NA
3:  1  3 NA
4:  2  4 NA
> merge.data.frame(a,b[0],all=TRUE)  # correct
  P Q  R
1 1 3 NA
2 2 4 NA

Ricardo 深入了解并在 v1.8.9 中修复了它。来自新闻:

merge no longer returns spurious NA row(s) when y is empty and all.y=TRUE (or all=TRUE), #2633. Thanks to Vinicius Almendra for reporting. Test added.

关于r - merge.data.table with all=True 引入 NA 行。这样对吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15566250/

相关文章:

r - 在 data.table R 中使用 lapply .SD

r - [R]如何按 "a. key >= b. key "等条件合并两个表并选择max(c)记录?

r - 我如何加速这个 _for_ 循环?用data.table + lapply?

sql - Oracle(旧?)加入 - 用于转换的工具/脚本?

sql - 如何在 MySQL 中执行 FULL OUTER JOIN?

r - summarise_at 对不同的变量使用不同的函数

r - 计算给定条件的百分比

r - 使用 `:=` 语法以编程方式生成要分配给 data.table 的列列表

mysql - 如何从mysql中的外连接表(超过2个表)获取值

r - R中的strptime返回NA