<na>和NA之间有什么区别?</na>

时间:2013-04-27 15:24:13

标签: r missing-data

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

head(SMOKE)
N N <NA> Y Y N
Levels: Y N

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

3 个答案:

答案 0 :(得分:45)

当您处理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

编辑回答@ Arun的问题:

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

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

注意NA的两种不同风格:

> df
  x    y
1 1    a
2 2 <NA>
3 3    c
4 4   NA

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

[1] "a"  NA   "c"  "NA"

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

print(df$y, quote=FALSE)
[1] a    <NA> c    NA  

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

答案 1 :(得分: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

有人认为这是一种方法,通过这种方式可以区分NA"NA",因为它打印时不带引号,即使对于字符标签/级别也是如此:

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

答案 2 :(得分:-1)

也许一个例外可能是data.table。 那里似乎是一个字符字段将其打印为,而数字字段将其打印为NA。注意:我在中添加了多余的空格,否则此网页无法正确显示。

library("data.table")

y<-data.table(a=c("a","b",NA))

print(y)
      a
1:    a
2:    b
3: < NA >

factor(y$a)

[1] a    b    < NA >

Levels: a b

## we enter a numeric argument

y<-data.table(a=c(1,2,NA))

print(y)
    a
1:  1
2:  2
3: NA

factor(y$a)

[1] 1    2    < NA >

Levels: 1 2