【问题标题】:fast join data.table (potential bug, checking before reporting)快速连接 data.table(潜在错误,报告前检查)
【发布时间】:2012-12-22 13:15:14
【问题描述】:

这可能是一个错误。在这种情况下,我将删除此问题并报告为错误。我希望有人检查一下,以确保我没有做错什么,以免浪费开发人员的时间。

test = data.table(mo=1:100, b=100:1, key=c("mo", "b"))
mo = 1
test[J(mo)]

返回整个testdata.table,而不是返回的正确结果

test[J(1)]

我相信错误可能来自testmo 连接的表具有相同的列名。有没有人遇到同样的问题?

【问题讨论】:

  • 我无法解释这种行为,但fwiw:foo=1; test[J(foo)] 有预期的结果。 test[mo]mo = data.table(1); test[mo] 也是如此。
  • 另外,identical(test[J(1)], test[J(mo <- 1)]) 提供TRUE

标签: r merge data.table


【解决方案1】:

这是一个范围界定问题,类似于data.table-faq 2.13 (warning, pdf) 中讨论的问题。因为test 包含一个名为mo 的列,所以在评估J(mo) 时,它会返回整个列,而不是在全局环境中找到的mo 的值,它会屏蔽它。 (当然,当您想做test[mo<4]! 之类的事情时,这种作用域行为非常很好!)

试试这个看看发生了什么:

test <- data.table(mo=1:5, b=5:1, key=c("mo", "b"))
mo <-  1
test[browser()]
Browse[1]> J(mo)
#    mo
# 1:  1
# 2:  2
# 3:  3
# 4:  4
# 5:  5
# Browse[1]> 

正如链接的常见问题解答中所建议的,一个简单的解决方案是重命名索引变量:

MO <- 1
test[J(MO)]
#    mo b
# 1:  1 6

(这也将起作用,原因在?data.tablei 的文档中讨论过):

mo <- data.table(1)
test[mo]
#    mo b
# 1:  1 6

【讨论】:

    【解决方案2】:

    这不是错误,而是记录在案的行为 afaik。这是一个范围界定问题:

    test[J(globalenv()$mo)]
       mo   b
    1:  1 100
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-04
      相关资源
      最近更新 更多