3

icontainsNA时,不返回该特定行。我不确定这是预期的行为还是它?

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
4

2 回答 2

3

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

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

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

  • NA的 ini被视为FALSE.
  • !ini被视为否定。

这在?.data.table(正如 G. Grothendieck 在另一个答案中指出的那样)中有很好的记录。相关部分是:

整数和逻辑向量的工作方式与 [.data.frame. 除了逻辑 i 中的 NA 之外,它被视为 FALSE,并且单个 NA 逻辑不会被回收以匹配行数,就像在 [.data.frame.
...
所有类型的“i”都可以以 ! 为前缀。这表示应该执行不加入或不选择。在整个 data.table 文档中,当我们提到“i”的类型时,我们指的是“!”之后的“i”类型(如果存在)。

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

  1. 删除前面的!
  2. 解释剩下的i
  3. 否定这种解释

处理 s 的方式NA是将这些值设置为FALSE
然而——而且非常重要的是——这发生在上面的第 2 步中。

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


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

由于!NAis still NA,解释 !!(NA) 的修改顺序为:

!!(NA)  
!( !(NA) )  
!(  NA   )
!( FALSE )
TRUE
于 2013-07-07T01:49:16.323 回答
1

这是记录在案的行为。请参阅 中的i参数描述?data.table

于 2013-07-07T00:33:42.267 回答