【发布时间】: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