8

在填充的 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
4

4 回答 4

7

问题中的示例太简单了,无法显示问题,因此造成了混乱和讨论。使用两个 one-column data.tables 不足以显示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 中对其进行了修复。来自新闻:

当 y 为空且 all.y=TRUE(或 all=TRUE)时,merge 不再返回虚假的 NA 行,#2633。感谢 Vinicius Almendra 的报道。添加了测试。

于 2013-08-31T00:39:21.340 回答
2

全部:逻辑;all = TRUE 是保存设置 all.x = TRUE 和 all.y = TRUE 的简写。

all.x:逻辑;如果为 TRUE,那么额外的行将被添加到输出中,x 中的每一行在 y 中没有匹配的行。这些行将在那些 通常用来自 y 的值填充的列中具有 'NA' 。默认值为 FALSE,因此只有包含 x 和 y 数据的行才会包含在输出中。

all.y :逻辑;类似于上面的 all.x。

这取自data.table 文档merge有关更多信息,请查看那里对函数参数的描述。

我认为这回答了你的问题。

于 2013-03-22T10:01:43.183 回答
0

给定你定义ab你的方式。的简单用法rbind(a,b)将仅返回 的行a

但是,如果您想将 NULL 数据表b与其他一些非空数据表合并a,则有不同的方法。当我不得不在不同的循环中合并不同的数据表时,我遇到了类似的问题。我使用了这个解决方法。

  #some loop that returns data.table named a
  #another loop starts
  if(all.equal(a,b<-data.table())==TRUE){
  b<-a
  next
  }
  merge(a,b,c("Factor1","Factor2"))

这对我有帮助,也许对你也有帮助。

于 2013-03-22T09:59:01.887 回答
0

这是可以预料的,因为merge.data.frame all=T是 a full outer join,所以你得到两个表的所有键,看看合并

于 2013-03-22T10:41:27.487 回答