R:键在data.table中应该这样做吗?

R:键在data.table中应该这样做吗?,r,key,data.table,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) 然后,还有一个例子产生了不同的,更合理的结果 foo <- data.table(a = c(4:1), b = c(2:5), c = c(3:6), d = c(4:7)) setkey(foo, b) ke

我在
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)
然后,还有一个例子产生了不同的,更合理的结果

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
foo
这是一个特色吗?是虫子吗

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

库(data.table)

foo忘记添加:
R
版本是3.3.1和
数据。table
是1.10.4
是提取的单行函数
排序
属性:
函数(x)属性(x,“排序”,精确=真)
。我在中发现了许多行,如
setattr(ans,“sorted”,…)
,但它太长了,我无法理解。我猜data.table将测试
by
是否有序,并相应地设置
sorted
属性,但不确定。谢谢,看起来您是对的。我很尴尬,一开始我没有在github上查到它(
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