<NA>和NA有什么区别?

oor*_*ort 41 r missing-data

我有一个名为SMOKE的因子,其级别为"Y"和"N".丢失的值被替换为NA(从初始级别"NULL").但是,当我查看因素时,我会得到这样的结果:

head(SMOKE)
N N <NA> Y Y N
Levels: Y N
Run Code Online (Sandbox Code Playgroud)

为什么R显示NA<NA>?并且有区别吗?

Ric*_*rta 46

当你处理时factors,当NA用斜角括号(<NA>)包裹时,表示它实际上是NA.

当它NA没有括号时,那么它不是 NA,而是一个适当的因子,其标签是"NA"

# Note a 'real' NA and a string with the word "NA"
x <- factor(c("hello", NA, "world", "NA"))

x
[1] hello <NA>  world NA   
Levels: hello NA world      <~~ The string appears as a level, the actual NA does not. 

as.numeric(x)              
[1]  1 NA  3  2            <~~ The string has a numeric value (here, 2, alphabetically)
                               The NA's numeric value is just NA
Run Code Online (Sandbox Code Playgroud)

编辑回答@ Arun的问题:

R只是试图区分一个值为两个字母的字符串"NA"和一个实际的缺失值.NA 因此,您在显示时看到的差异dfdf$y.例:

df <- data.frame(x=1:4, y=c("a", NA_character_, "c", "NA"), stringsAsFactors=FALSE)
Run Code Online (Sandbox Code Playgroud)

注意NA的两种不同风格:

> df
  x    y
1 1    a
2 2 <NA>
3 3    c
4 4   NA
Run Code Online (Sandbox Code Playgroud)

但是,如果我们只看'df $ y'

[1] "a"  NA   "c"  "NA"
Run Code Online (Sandbox Code Playgroud)

但是,如果我们删除引号(类似于我们在向控制台打印data.frame时看到的):

print(df$y, quote=FALSE)
[1] a    <NA> c    NA  
Run Code Online (Sandbox Code Playgroud)

因此,我们再次NA通过有角度的括号区分.

  • RicardoSaporta,对我来说有点不清楚.在检查[**来自@ SimonO101的答案**](http://stackoverflow.com/a/16315617/559784)时,我发现如果你有一个data.frame,例如:`df < - data.frame( x = 1:5,y = c("a","b",NA_character_,"d"),stringsAsFactors = FALSE)`,它仍然保持"<NA>".当然问题是向量.但是,我还不清楚这一点.例如:打印列时,`df $ y`它会消失.但是当你打印`df`时,它会显示尖括号. (2认同)

Rei*_*son 11

这只是R NA在一个因子中显示的方式:

> as.factor(NA)
[1] <NA>
Levels: 
> 
> f <- factor(c(1:3, NA))
> levels(f)
[1] "1" "2" "3"
> f
[1] 1    2    3    <NA>
Levels: 1 2 3
> is.na(f)
[1] FALSE FALSE FALSE  TRUE
Run Code Online (Sandbox Code Playgroud)

一个推测这是由哪一个会区分的装置NA"NA"在它打印没有引号的因子被印刷的方式,即使对于字符标签/水平:

> f2 <- factor(c("NA",NA))
> f2
[1] NA   <NA>
Levels: NA
> is.na(f2)
[1] FALSE  TRUE
Run Code Online (Sandbox Code Playgroud)