<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
显示为 <NA>
?有区别吗?
【问题讨论】:
【参考方案1】:当您处理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
因此,您在显示 df
与 df$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 <- data.frame(x=1:5, y=c("a", "b", NA_character_, "d"), stringsAsFactors=FALSE)
,它仍然是<NA>
。当然,问题是针对向量的。但是,这对我来说还不清楚。例如:当您打印列时,df$y
它会消失。但是当你打印df
时,它会显示尖括号。
另见addNA()
,例如levels(addNA(x))
也可能值得展示:factor(c("NA", "<NA>", 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
【讨论】:
我不确定这是什么异常。上面的答案基本上说当NA
在factor
或character
中时,它被打印为<NA>
。这与您使用 data.table
演示的相同。以上是关于<NA> 和 NA 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章
One Hot Encoding 和 pandas.categorical.code 有啥区别