运算符== data.table中的逻辑列不一致

时间:2014-10-10 21:09:45

标签: r data.table

请参阅以下可重现的示例:

library(data.table)
set.seed(123)
DT <- data.table(A=rep(0.3,10000))
DT[, B := runif(.N) < A]
DT[B == T, .N]
# [1] 3005
DT[, summary(B)]
#    Mode   FALSE    TRUE    NA's
# logical    6995    3005       0

一切看起来都很好,两种方法的“TRUE”值相同。现在用新的替换col B.

DT[, B := runif(.N) < A]
DT[B == T, .N]
# [1] 3331
DT[, summary(B)]
#    Mode   FALSE    TRUE    NA's
# logical    6981    3019       0 

B栏中的'T'计数不同!它是同一列,但一种方法给出3331“TRUE”值,另一种方法给出3019。

绕过==

DT[B != F, .N]
# [1] 3019
DT[, summary(B)]
#    Mode   FALSE    TRUE    NA's
# logical    6981    3019       0 

哪个再次正确

我可以在Windows 8.1 x64上使用data.table v1.94和1.9.5重现它。


这是一个更容易重现的示例,没有runif()

require(data.table) ## 1.9.4+
DT = data.table(x = 1:5)
DT[, y := x <= 2L]
#    x     y
# 1: 1  TRUE
# 2: 2  TRUE
# 3: 3 FALSE
# 4: 4 FALSE
# 5: 5 FALSE

DT[y == TRUE, .N]
# [1] 2             <~~~~~~ correct result.

DT[, y := x <= 3L]
#    x     y
# 1: 1  TRUE
# 2: 2  TRUE
# 3: 3  TRUE
# 4: 4 FALSE
# 5: 5 FALSE

DT[y == TRUE, .N]
# [1] 2             <~~~~~~ incorrect result, should be 3!

2 个答案:

答案 0 :(得分:5)

现已在GitHub上的v1.9.5中修复。

  

:=set*现在删除辅助密钥(v1.9.4中的新功能),以便DT[x==y]:=之后set*再次无需options(datatable.auto.index=FALSE) {1}}。只有setkey()正确删除了辅助密钥。增加了23项测试。感谢user36312报告,#885

答案 1 :(得分:1)

看看@nrussell建议的内容。 根据@Eddi的说法,这也可能是一个错误。 下面可能是一个临时的解决方法。 @Arun也建议。 请参阅意见交换。

案例1

> set.seed(123)
> DT <- data.table(A=rep(0.3,10000))
> DT[, B := runif(.N) < A]
> DT[B == T, .N]
[1] 3012
> DT[, summary(B)]
   Mode   FALSE    TRUE    NA's 
logical    6988    3012       0 

案例2

> set.seed(123)
> DT[, B := runif(.N) < A]
> DT[B == T, .N]
[1] 3012
> DT[, summary(B)]
   Mode   FALSE    TRUE    NA's 
logical    6988    3012       0 

案例3

> set.seed(123)
> DT[, B := runif(.N) < A]
> DT[B != F, .N]
[1] 3012
> DT[, summary(B)]
   Mode   FALSE    TRUE    NA's 
logical    6988    3012       0