我发现我相信data.table中的一个错误让我疯狂。我试图创建一个最小的工作示例,但我很难这样做 - 所以我提供了一个用于复制的数据集。我使用的是R版本3.1.0,数据表1.9.4。
以下是问题症结的一个例子:
> log[select==1,list(trials=tabulate(select)),by=subj]
报告主题29的值为“65”
> log[select==1 & subj==29,list(trials=tabulate(select)),by=subj]
报告主题29的值为“85”。即使没有看到其余的代码,它们应该是相同的,不是吗?
详细信息:数据文件“log.csv”可用@ http://pastebin.com/ZwD7enxj
和我的R代码:
library(data.table)
log <- NULL
log <- fread('log.csv')
setkey(log,subj)
fun1 <- function() {
log[,select:= 1]
log[blocktime==10 | rt>10.0,select := 0]
log[log[select==1,mean(correct),by=subj],avgACC := V1]
}
fun2 <- function () {
log[blocktime==1 | blocktime==5,select := 1]
log[select==1,list(trials=tabulate(select)),by=subj]
}
现在,如果我在fun2()之前运行fun1(),我会看到上面提到的错误行为。如果我在fun1()之前运行fun2(),它似乎工作正常。
明显的修复:
- 删除fun1()中的最后一行
- 在fun2()的开头添加setkey(log,subj)也解决了问题
这到底发生了什么?如果这是期望的行为,那就非常混乱。