NA在`i`表达data.table(可能的bug)

时间:2013-07-06 23:52:40

标签: r data.table

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

2 个答案:

答案 0 :(得分:3)

正如@flodel指出的那样,问题可以简化为,为什么这不是TRUE

identical(x[as.logical(a)], x[!!as.logical(a)])   # note the double bangs

答案在于data.table如何处理NA中的i以及它如何处理!中的i。两者都接受特殊待遇。问题确实出现在两者的结合中。

    {li} NA中的i被视为FALSE!中的
  • i被视为否定。

这在?.data.table中有详细记载(正如G.格洛腾迪克在另一个答案中指出的那样)。 相关部分是:

  

整数和逻辑向量的工作方式与它们在[.data.frame中的工作方式相同。除了逻辑i中的NA被视为FALSE并且单个NA逻辑不被回收以匹配行数,因为它在[.data.frame中。   ...
  所有类型的'i'都可以以!为前缀。这表示应该执行非连接或非选择。在整个data.table文档中,我们引用'i'的类型,我们指的是'!'之后的'i'类型,如果存在的话。

如果您查看[.data.table的代码,!的处理方式(如果存在)是

  1. 删除前面的!
  2. 解释剩余的i
  3. 否定该解释
  4. 处理NA的方法是将这些值设置为FALSE 然而 - 而且非常重要 - 这发生在上面的第2步中。

    因此,真正发生的事情是当i包含NAi以[{1}}为前缀时,则NA会被有效地解释为! 。虽然从技术上讲,这是记录在案的,但我不确定这是否符合预期。


    当然,最后一个问题是@ flodel的观点:为什么TRUEx[as.logical(a)]不一样?这样做的原因是只有第一次爆炸得到特殊处理。第二次爆炸被x[!!as.logical(a)]解释为正常。

    由于R仍然是!NA,因此解释!!(NA)的修改顺序为:

    NA

答案 1 :(得分:1)

这是记录在案的行为。请参阅i?data.table参数的说明。