当i
包含NA
时,不会返回该特定行。我不确定这是预期的行为还是它?
require(data.table)
x = data.table(a=c(NA, 1:3, NA))
x[a>0]
a
1: 1
2: 2
3: 3
x[!(a>0)]
a
1: NA
2: NA
x[a<0]
Empty data.table (0 rows) of 1 col: a
x[!(a<0)]
a
1: NA
2: 1
3: 2
4: 3
5: NA
> sessionInfo()
R version 2.15.2 (2012-10-26)
Platform: x86_64-unknown-linux-gnu (64-bit)
locale:
[1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C
[3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8
[5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8
[7] LC_PAPER=C LC_NAME=C
[9] LC_ADDRESS=C LC_TELEPHONE=C
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] data.table_1.8.8
答案 0 :(得分:3)
正如@flodel指出的那样,问题可以简化为,为什么这不是TRUE
:
identical(x[as.logical(a)], x[!!as.logical(a)]) # note the double bangs
答案在于data.table如何处理NA
中的i
以及它如何处理!
中的i
。两者都接受特殊待遇。问题确实出现在两者的结合中。
NA
中的i
被视为FALSE
。
!
中的i
被视为否定。 这在?.data.table
中有详细记载(正如G.格洛腾迪克在另一个答案中指出的那样)。
相关部分是:
整数和逻辑向量的工作方式与它们在[.data.frame中的工作方式相同。除了逻辑i中的NA被视为FALSE并且单个NA逻辑不被回收以匹配行数,因为它在[.data.frame中。 ...
所有类型的'i'都可以以!为前缀。这表示应该执行非连接或非选择。在整个data.table文档中,我们引用'i'的类型,我们指的是'!'之后的'i'类型,如果存在的话。
如果您查看[.data.table
的代码,!
的处理方式(如果存在)是
!
i
处理NA
的方法是将这些值设置为FALSE
然而 - 而且非常重要 - 这发生在上面的第2步中。
因此,真正发生的事情是当i
包含NA
而i
以[{1}}为前缀时,则NA会被有效地解释为!
。虽然从技术上讲,这是记录在案的,但我不确定这是否符合预期。
当然,最后一个问题是@ flodel的观点:为什么TRUE
与x[as.logical(a)]
不一样?这样做的原因是只有第一次爆炸得到特殊处理。第二次爆炸被x[!!as.logical(a)]
解释为正常。
由于R
仍然是!NA
,因此解释!!(NA)的修改顺序为:
NA
答案 1 :(得分:1)
这是记录在案的行为。请参阅i
中?data.table
参数的说明。