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()

require(data.table)#1.9.4+
DT=数据表(x=1:5)

DT[,y:=x看看@nrussell的建议。 根据@Eddi的说法,这也可能是一个bug。 下面可能是一个临时的工作环境。也是@Arun建议的。 请参阅交换意见

案例1
>设置种子(123)
>DT[,B:=runif(.N)DT[B==T,.N]
[1] 3012
>DT[,摘要(B)]
模式假真NA's
逻辑698830120
案例2
>设置种子(123)
>DT[,B:=runif(.N)DT[B==T,.N]
[1] 3012
>DT[,摘要(B)]
模式假真NA's
逻辑698830120
案例3
>设置种子(123)
>DT[,B:=runif(.N)DT[B!=F,.N]
[1] 3012
>DT[,摘要(B)]
模式假真NA's
逻辑698830120
现在已在GitHub上修复

:=
set*
现在删除辅助键(在v1.9.4中新增),以便
DT[x==y]
:=
set*
之后再次工作,无需
选项(datatable.auto.index=FALSE)
。仅
setkey()
正确删除了辅助密钥。添加了23个测试。感谢用户36312的报告


这不是答案谢谢你的回答@KFB。你的例子很有效,但是我不明白为什么我没有设置种子DT[B==t,.N]和DT[,summary(B)]创建列B后给出不同的结果。在每次运行之前,我的示例不带set.seed是否运行良好?@eddi,请确保您的评论是可以理解的。不过,我相信绿色用户(包括我自己)有时更容易“看到”为了更好地理解案例场景,请参见插图。Thanks@KFB一种解决方法是禁用索引,例如执行
DT[(B==T),.N]
Yep,bug-抱歉。
options(datatable.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