请参阅以下可重现的示例:
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”值的计数是相同的。现在将 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!