我有一个名为SMOKE的因子,其级别为“Y”和“N”。丢失的值被替换为NA(从初始级别“NULL”)。但是,当我查看因素时,我会得到类似的结果:
head(SMOKE)
N N <NA> Y Y N
Levels: Y N
为什么R将NA
显示为<NA>
?并且有区别吗?
答案 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
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
。
答案 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。
那里似乎是一个字符字段将其打印为
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