这是一个可重现的示例:
myDT <- data.table(ID=c('A','B','B'), val=c('check','check','a'));
myDT[val == "check"]; # <= secondary index created on calling this
myDT[, val:=ifelse(.N>1, '2', '1'), by=ID]
myDT
# ID val
# 1: A 1
# 2: B 2
# 3: B 2
key(myDT)
# NULL
key2(myDT)
# [1] "val"
现在,我调用一个简单的命令,它给出了相当奇怪的(对我来说)结果:
myDT[val=='2', res:='yes'][];
# ID val res
# 1: A 1 NA
# 2: B 2 yes
# 3: B 2 NA
带过滤器
val=='2'
,我希望得到记录 2 和 3,但实际上我只得到了记录 3。这显然是由于辅助键,因为它的删除带来了预期的行为:set2key(myDT, NULL)
myDT[val=='2', res:='yes'][];
# ID val res
# 1: A 1 NA
# 2: B 2 yes
# 3: B 2 yes
我想知道这是一个错误还是预期的行为。就我而言,这显然是不受欢迎的:我什至不知道二级键(在询问 that SO question 之前)这样的东西,我花了很多时间试图弄清楚为什么我错过了一些记录。对我来说,我通过添加
set2key(myDT, NULL)
解决了这个问题。指令,但现在我担心类似的事情可能会发生在我代码的其他部分,我不知道如何检测/防止它 - 我不想添加 set2key(., NULL)
每隔一行调用一次...
最佳答案
这确实是一个错误(我报告了它,但结果已经报告了),并且它在包版本 1.9.7 中得到了修复 - 现在一切正常!
关于r - data.table 二级键的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34983209/