R数据表1.9.2版本setkey问题

6

看起来是1.8.10版本后引入的一个与包含列表的DT的setkey相关的bug。 运行下面两个代码以查看问题:

library(data.table)
dtl <- list()
dtl[[1]] <- data.table(scenario = 1,
                       processing = c(function(x) x))
dtl[[2]] <- data.table(scenario = 2,
                       processing = c(function(x) x))
dt <- rbindlist(dtl)
setkeyv(dt, c("scenario"))

其次,目前存在错误:

dtl <- list()
dtl[[1]] <- data.table(scenario = 2, # <- note we change order
                       processing = c(function(x) x))
dtl[[2]] <- data.table(scenario = 1,
                       processing = c(function(x) x))
dt <- rbindlist(dtl)
setkeyv(dt, c("scenario")) #setkey cannot sort?

它在1.8.10版本中运行良好。我无法在我的DT上设置关键字,似乎与包含函数列表的DT有关。有什么简单的解决办法吗?我追踪错误消息到C代码,但不知道如何修复它。

R 3.0.2 + data.table 1.9.2 在 Windows 64位操作系统上运行。 谢谢


你的代码注释提供了一个“简单的解决方法”;如果setkey无法排序,请不要尝试使用它进行排序:dt <- dt[order(scenario)];setkey(dt, scenario) - GSee
我认为这是一个可重现的错误示例#5366。甚至可以通过dt <- data.table(a=2:1,b= list(list(1),list(2))); setkeyv(dt,'a')更简单地重现它。 - mnel
感谢你们两位。GSee,这个简单的修复方法在更大的数据和更多的键上也有效了。mnel,确实是同样的错误,我不知道为什么它的优先级那么低。Matt,我们可以提高 #5366 的优先级,在下一个版本中处理吗? - jangorecki
1个回答

5

该问题已在v1.9.3的提交#1216中得到修复(目前是开发版本)。从NEWS中可以看到:

setkey不允许列表列作为键。但是,在setkey中存在一个错误,不允许对仅包含列表列的data.table设置键。现已修复。关闭#5366。感谢James Sams提供报告,感谢Michael Nelson使用最小可重复示例准确定位问题。也感谢MusX在stack overflow上提出的报告。

我们应该很快将1.9.4(下一个稳定版)推荐给CRAN。


太好了!感谢您的快速反应,我甚至还没有在我的代码中所有地方都加入预排序的解决方法。 - jangorecki

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接