三种data.table合并行为不一致

5

今天早上我一直在搜索,试图弄清楚下面的故障是否是预期的,但没有找到任何有关的信息。 有人可以帮我指向相关的讨论吗?否则,我可能会将其提交为问题。谢谢。

library(data.table)

x <- data.table( a = 1:3 )
y <- data.table( a = 2:4 )
z <- data.table( a = 3:5 )

# works
merge( x , y )
# works
merge( y , z )

# fails
merge( x , merge( y , z ) )
# Error in merge.data.table(x, merge(y, z)) :
#   A non-empty vector of column names for `by` is required.

# works
merge( merge( x , y ) , z )

看起来这个错误来自于data.table,因为它是与data.frame一起使用的。 - GKi
1个回答

6
这是一个明显的错误,请报告它。幸运的是,这应该很容易修复。 merge.data.table 包含以下代码:
if (is.null(by)) 
  by = intersect(key(x), key(y))
if (is.null(by)) 
  by = key(x)
if (is.null(by)) 
  by = intersect(names(x), names(y))

现在的问题是,y已经被键掉了(因为merge.data.table设置了键):

x <- data.table( a = 1:3 )
y <- merge(data.table( a = 2:4 ), data.table( a = 3:5 ))
haskey(y)
#[1] TRUE

那么,

intersect(key(x), key(y))
#character(0)

因此,以下任何一个if条件都不为真(我们希望第三个条件在这里应用)。
这在您的最后一种情况中不会发生,因为有以下原因:
intersect("foo", NULL)
#NULL
intersect(NULL, "foo")
#character(0)

https://github.com/Rdatatable/data.table/issues/4772 - Anthony Damico

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接