r - data.table 二级键的问题

标签 r data.table

这是一个可重现的示例:

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/

相关文章:

R,基于方差截止的滤波器矩阵

r - Data.Table:每两周汇总一次

r - 使用 data.table 创建一列回归系数

python - 通过在 R 中附加记录来生成大型数据文件的好方法是什么?

r - 在一系列连续值中查找最后一行

r - 如何用R中的频率表获得中位数?

R:按组在 data.table 列中找到第一个非 NA 观察

performance - data.frame 方法的最有效列表?

R data.table,选择没有NA的列

r - 按组清除 R 数据框中的行