<NA> 和 NA 有啥区别?

Posted

技术标签:

【中文标题】<NA> 和 NA 有啥区别?【英文标题】:What is the difference between <NA> and NA?<NA> 和 NA 有什么区别? 【发布时间】:2013-04-21 15:38:52 【问题描述】:

我有一个名为 SMOKE 的因子,其级别为“Y”和“N”。缺失值被替换为 NA(从初始级别“NULL”开始)。但是,当我查看因素时,我会得到如下信息:

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

为什么 R 将 NA 显示为 &lt;NA&gt;?有区别吗?

【问题讨论】:

【参考方案1】:

当您处理factors 时,当NA 用尖括号(&lt;NA&gt;)包裹时,这表明它实际上是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

【讨论】:

感谢您为我澄清这一点 RicardoSaporta,我有点不清楚。在检查this answer from @SimonO101 时,我发现如果你有一个data.frame,例如:df &lt;- data.frame(x=1:5, y=c("a", "b", NA_character_, "d"), stringsAsFactors=FALSE),它仍然是&lt;NA&gt;。当然,问题是针对向量的。但是,这对我来说还不清楚。例如:当您打印列时,df$y 它会消失。但是当你打印df 时,它会显示尖括号。 另见addNA(),例如levels(addNA(x)) 也可能值得展示:factor(c("NA", "&lt;NA&gt;", NA))。查看某物的印刷表示并不是了解它是什么的好方法!【参考方案2】:

这正是 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

【讨论】:

【参考方案3】:

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

【讨论】:

我不确定这是什么异常。上面的答案基本上说当NAfactorcharacter中时,它被打印为&lt;NA&gt;。这与您使用 data.table 演示的相同。

以上是关于<NA> 和 NA 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

`%in%` 和 `==` 有啥区别?

One Hot Encoding 和 pandas.categorical.code 有啥区别

python 相当于 R 的 NA 是啥?

R语言 矩阵里有NA,怎么只保留非NA?

<!-- text --> 和 /* text */ 注释有啥区别?

PlaceHolder 和 <div /> 有啥区别?