merge.data.table with all = True引入了NA行。它是否正确?

时间:2013-03-22 08:55:36

标签: r data.table outer-join

在填充的data.table和另一个空的data之间进行合并会在结果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 个答案:

答案 0 :(得分:6)

问题中的例子过于简单,无法显示问题,因此存在混淆和讨论。使用两个单列data.table并不足以显示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

里卡多深究这一点并在v1.8.9中修复了它。来自新闻:

  当y为空时,

merge不再返回虚假的NA行   all.y = TRUE(或all = TRUE),#2633。谢谢   到Vinicius Almendra报道。测试补充。

答案 1 :(得分:2)

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

         

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

         全部:逻辑;类似于上面的all.x.

  

这取自 data.table documentation 。有关更多信息,请查看merge函数的参数说明。

我认为这可以回答你的问题。

答案 2 :(得分:0)

根据您的方式定义abrbind(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"))

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

答案 3 :(得分:0)

对于merge.data.frame all=T而言,这是预期的full outer join,因此您可以获得两个表的所有键,请参阅about merge