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

时间:2015-11-24 13:31:25

标签: 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      0

到目前为止,一切都很好。但后来我注意到了:

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

> nrow(data[del==FALSE])
[1] 126790922

似乎有些条目是TRUEFALSE,但实际上介于01之间:

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

> nrow(data[del>0.5])
[1] 2088978

但这怎么可能发生?我只将TRUEFALSE分配给了此列。同样,我本来希望产生一个小例子,但它不起作用,从某种意义上说,如果我选择一个子集,问题就会消失。例如,如果选择行47639(id是唯一的):

> data[id==47639, list(del)]
    del
1: TRUE

del似乎设置为TRUE。因此,如果我首先选择此特定行,然后测试delTRUE是否有效:

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

所以dputdget共同产生:

> 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文件,如果有任何帮助,但我不知道如何在这里正确发布。

0 个答案:

没有答案