R data.table中的逻辑变量不是真正的二进制变量
我努力想出一个简单的例子来说明我的问题。不幸的是,我失败了。所以请道歉 我正在使用data.table 1.9.6处理一个非常大的数据集,该数据集有超过1亿行和近60列。在进行了几次操作后,我遇到了列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
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 = <