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