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

R 运算符==data.table中逻辑列不一致,r,data.table,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 哪一个是正确的 我可以用data.table v1.

请参见以下可复制示例:

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
哪一个是正确的

我可以用data.table v1.94和1.9.5在Windows 8.1 x64上复制它

这里有一个更容易复制的例子,没有runif


看看@nrussell的建议。 根据@Eddi的说法,这也可能是一个bug。 下面可能是一个临时工作。也由@Arun提出。 请参阅交换意见

案例1 案例2 案例3 现在固定在GitHub上

:=和set*现在删除v1.9.4中新增的辅助键,以便DT[x==y]在a:=或set*之后再次工作,而不需要optionsdatatable.auto.index=FALSE。只有setkey正确地删除了辅助密钥。增加了23项测试。感谢用户36312的报告


这不是答案谢谢你的回答@KFB。你的例子是有效的,但是我不明白为什么我没有设置种子DT[B==t,.N]和DT[,summaryB]在创建列B后给出不同的结果。在每次运行之前不使用set.seed的示例是否运行良好?@eddi,您的评论可以理解。尽管如此,我相信绿色用户(包括我自己)有时更容易看到案例场景,以便更好地理解。这就是例证。Thanks@KFB一种解决方法是禁用索引,例如执行DT[B==T,.N]Yep,bug-sorry。optionsdatatable.auto.index=FALSE关闭新功能:需要删除涉及更新列的任何辅助索引。。。
DT[, B := runif(.N) < A]
DT[B == T, .N]
# [1] 3331
DT[, summary(B)]
#    Mode   FALSE    TRUE    NA's
# logical    6981    3019       0 
DT[B != F, .N]
# [1] 3019
DT[, summary(B)]
#    Mode   FALSE    TRUE    NA's
# logical    6981    3019       0 
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!
> 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 
> 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 
> 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