R data.table中的逻辑变量不是真正的二进制变量

R data.table中的逻辑变量不是真正的二进制变量,r,data.table,logical-operators,R,Data.table,Logical Operators,我努力想出一个简单的例子来说明我的问题。不幸的是,我失败了。所以请道歉 我正在使用data.table 1.9.6处理一个非常大的数据集,该数据集有超过1亿行和近60列。在进行了几次操作后,我遇到了列del的以下问题,我试图解释该列,给出以下输出: > data[, class(del)] [1] "logical" > data[, summary(del)] Mode FALSE TRUE NA's logical 124763883 2088978

我努力想出一个简单的例子来说明我的问题。不幸的是,我失败了。所以请道歉

我正在使用data.table 1.9.6处理一个非常大的数据集,该数据集有超过1亿行和近60列。在进行了几次操作后,我遇到了列
del
的以下问题,我试图解释该列,给出以下输出:

> data[, class(del)]
[1] "logical"

> data[, summary(del)]
   Mode     FALSE    TRUE   NA's
logical 124763883 2088978      0
到目前为止一切都很好。但后来我注意到:

> nrow(data[del==TRUE])
[1] 0

> nrow(data[del==FALSE])
[1] 126790922
似乎有些条目是
TRUE
FALSE
,但实际上介于
0
1
之间:

> nrow(data[del<0.5])
[1] 124763883

> nrow(data[del>0.5])
[1] 2088978
del
似乎设置为
TRUE
。因此,如果我先选择此特定行,然后测试
del
是否为
TRUE
它是否有效:

> data[id==47639][del==TRUE, list(del)]
    del
1: TRUE
但是
data[del==TRUE][id==47639,list(del)]
不产生任何输出

Empty data.table (0 rows) of 1 col: del
[编辑]为了制作一个可复制的示例,我花了大量时间缩小数据集的大小。它现在只有132行和1列,而且仍然是奇怪的行为。这就是我得到的:

data[, summary(del)]
   Mode   FALSE    TRUE    NA's 
logical     129       3       0 
> nrow(data[del==TRUE])
[1] 1
> nrow(data[del==FALSE])
[1] 127
> nrow(data[del<0.5])
[1] 129
> nrow(data[del>0.5])
[1] 3
因此,
dput
dget
一起产生:

> dput(data, "dt")
> dget("dt")
Error in parse(file = file, keep.source = keep.source) : 
  dt:16:62: unexpected '<'
15: FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE)), .Names = "del", class = c("data.table", 
16: "data.frame"), row.names = c(NA, -132L), .internal.selfref = <
dput(数据,“dt”) >dget(“dt”) 分析时出错(file=file,keep.source=keep.source):
dt:16:62:意外“你用CRAN标记了这个,但是你在CRAN(1.9.6)上使用的是最新的data.table版本吗?”?早些时候有一个bug,这意味着你必须用括号写
数据[(del==TRUE)]
,才能得到预期的结果。@Frank,不仅仅是
数据[(del)]
?@docendodiscimus D'oh,你说得对。感谢你们两位。是的,我使用的是data.table的最新版本,即1.9.6。我将尝试你提到的解决方法。但是,您知道这个错误是在哪里发布的吗?它是否也会影响其他列类型?它影响了许多情况,如
DT[a==x]
DT[a%in%y]
,与列类型无关。如果您在1.9.6中看到类似的问题,可能需要一个可复制的示例。此处提供了相关指导:有关与此bug相关的变更日志,请参阅此处的“自动索引”(1.9.6 bug修复中的第#6项):
> dput(data)
structure(list(del = c(FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, 
FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, 
FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, 
FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, 
FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, 
FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, 
FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, 
FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, 
FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, 
FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, 
FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, 
FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, 
FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, TRUE, 
FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, 
FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE)), .Names = "del", class = c("data.table", 
"data.frame"), row.names = c(NA, -132L), .internal.selfref = <pointer: 0x1914ca8>, index = structure(integer(0), "`__del`" = integer(0)))
> dput(data, "dt")
> dget("dt")
Error in parse(file = file, keep.source = keep.source) : 
  dt:16:62: unexpected '<'
15: FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE)), .Names = "del", class = c("data.table", 
16: "data.frame"), row.names = c(NA, -132L), .internal.selfref = <