我努力想出一个简单的例子来证明我的问题。不幸的是,我失败了。所以请道歉。
我正在使用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
但这怎么可能发生?我只将TRUE
和FALSE
分配给了此列。同样,我本来希望产生一个小例子,但它不起作用,从某种意义上说,如果我选择一个子集,问题就会消失。例如,如果选择行47639(id
是唯一的):
> data[id==47639, list(del)]
del
1: TRUE
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
在此处发布示例失败,原因是:
> 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
和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 = <
对我来说这看起来像个错误。当然,我可以使用解决方法data[(del)]
,但这意味着重写我之前的所有代码以确保安全。最让我担心的是,我不知道哪个操作会严重破坏data
。
我还可以提供一个小的RData文件,如果有任何帮助,但我不知道如何在这里正确发布。