13

来自help("NA")

还有其他支持缺失值的原子向量类型的常量 NA_integer_、NA_real_、NA_complex_ 和 NA_character_:所有这些都是 R 语言中的保留字。

我的问题是为什么没有NA_logical_或类似的,以及如何处理它。

具体来说,我正在创建几个非常相似的大型data.tables,它们应该与以后的类兼容rbind。当其中一个data.tables 缺少变量时,我正在创建该列,但将其设置为NA特定类型的所有 s。但是,从逻辑上讲,我不能这样做。

在这种情况下,它可能无关紧要(data.table不喜欢将列从一种类型强制转换为另一种类型,但它也不喜欢添加行,所以我必须创建一个新表来保存 rbound 版本),但我很困惑至于为什么NA_logical_逻辑上应该存在的 不存在。

例子:

library(data.table)
Y <- data.table( a=NA_character_, b=rep(NA_integer_,5) )
Y[ 3, b:=FALSE ]
Y[ 2, a:="zebra" ]
> Y
       a  b
1:    NA NA
2: zebra NA
3:    NA  0
4:    NA NA
5:    NA NA
> class(Y$b)
[1] "integer"

两个问题:

  1. 为什么不NA_logical_存在,而它的亲戚却存在?
  2. data.table在这种情况下或只是为了尽可能避免强制,我应该怎么做?我认为使用NA_integer_在强制方面对我没什么好处(它会强制我添加到 0L/1L 的逻辑,这并不可怕,但并不理想。
4

2 回答 2

14

NA已经合乎逻辑,因此NA_logical_不需要。只需NA在需要缺少逻辑的情况下使用。笔记:

> typeof(NA)
[1] "logical"

由于NA_*_名称都是保留字,因此可能希望尽量减少它们的数量。

例子:

library(data.table)
X <- data.table( a=NA_character_, b=rep(NA,5) )
X[ 3, b:=FALSE ]
> X
    a     b
1: NA    NA
2: NA    NA
3: NA FALSE
4: NA    NA
5: NA    NA
于 2013-10-24T11:46:26.330 回答
4

我认为基于此

 #define NA_LOGICAL R_NaInt

$R_HOME/R/include/R_ext/Arith.h我们可以建议在 R 代码中使用orNA_integerNA_real因此使用普通的旧NA代码:

R> as.logical(c(0,1,NA))
[1] FALSE  TRUE    NA
R> 
R> as.logical(c(0L, 1L, NA_integer_))
[1] FALSE  TRUE    NA
R> 

其中有

R> class(as.logical(c(0,1,NA)))
[1] "logical"
R> 
R> class(as.logical(c(0, 1, NA_real_)))
[1] "logical"
R> 

还是我误解了你的问题?R 的逻辑类型是三个值:是、否和缺失。我们可以使用整数或数字中的 NA 进行转换。这有帮助吗?

于 2013-10-24T11:38:38.253 回答