R:键应该在data.table中以这种方式运行吗?

时间:2017-07-14 09:53:55

标签: r key data.table

我在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中的元素排序,然后假定它是键控的。 这是一个功能吗?这是一个错误吗?

1 个答案:

答案 0 :(得分:1)

  

这是功能吗?是一个错误吗?

在第一个示例中,您得到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