【问题标题】:R: Should keys behave this way in data.table?R:键在 data.table 中应该以这种方式表现吗?
【发布时间】:2017-12-19 09:04:10
【问题描述】:

我在data.table 包中遇到了一些不直观的键行为。举个例子:

library(data.table)
foo <- data.table(a = c(1:4), b = c(2:5), c = c(3:6), d = c(4:7))
setkey(foo, b)

那么,key()就有一个惊人的结果:

key(foo[, .(mean(c + d)), by = .(b)]) # result is "b".
key(foo[, .(mean(c + d)), by = .(a)]) # result is "a". (!!)

那么,还有另一个例子产生了不同的、更合理的结果。

foo <- data.table(a = c(4:1), b = c(2:5), c = c(3:6), d = c(4:7))
setkey(foo, b)
key(foo[, .(mean(c + d)), by = .(b)]) # result is "b".
key(foo[, .(mean(c + d)), by = .(a)]) # result is NULL

我承认我很困惑。我的线索是key() 以某种方式检查结果表是否需要按by 中的元素排序,然后假设它是键控的。 它是一个功能吗?是bug吗?

【问题讨论】:

  • 忘记添加:R 版本是 3.3.1,data.table 是 1.10.4
  • key 是提取sorted 属性的单行函数:function (x) attr(x, "sorted", exact = TRUE)。我在github.com/Rdatatable/data.table/blob/master/R/data.table.R 中发现了很多类似setattr(ans, "sorted", ...) 的行,但是我跟不上。我猜 data.table 将测试by 是否有序并相应地设置sorted 属性但不确定。
  • 谢谢,看来您是对的。我很尴尬我现在没有在github上查找它。 :(

标签: r key data.table


【解决方案1】:

这是一个功能吗?是bug吗?

在第一个示例中,您得到key="a",因为该查询的结果恰好以a 列的非递减顺序排列。因此,我们可以将此行为称为功能。
问题是,可能并不总是希望以静默方式创建密钥,因此自从您提出该问题以来,这种行为已经改变。
现在(从 1.12.0 开始)从第一个块运行代码会删除键并忽略结果按 a 排序的事实。

library(data.table)
foo <- data.table(a = c(1:4), b = c(2:5), c = c(3:6), d = c(4:7))
setkey(foo, b)
key(foo[, .(mean(c + d)), by = .(b)])
#[1] "b"
key(foo[, .(mean(c + d)), by = .(a)])
#NULL

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-02
    • 1970-01-01
    • 2012-09-28
    • 2020-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多