这是一个可重复的例子:
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)
次来电话......
答案 0 :(得分:0)
这确实是一个错误(我报告了它,但事实证明已经报道了),它已经在包版本1.9.7中得到修复 - 现在一切正常!