将NA转换为一个因子水平

49

我有一个包含NA值的向量,我想用新的因子水平NA替换它们。

a = as.factor(as.character(c(1, 1, 2, 2, 3, NA)))
a
[1] 1    1    2    2    3    <NA>
Levels: 1 2 3

这个方法可行,但似乎是一种奇怪的做法。

a = as.factor(ifelse(is.na(a), "NA", a))
class(a)
[1] "factor"

这是预期输出:

a
[1] 1  1  2  2  3  NA
Levels: 1 2 3 NA

1
你想在因子(levels)和向量(vector)中保留NA还是"NA"?也许,你想用paste而不是as.character - alexis_laz
3个回答

66

您可以使用addNA()函数。

x <- c(1, 1, 2, 2, 3, NA)
addNA(x)
# [1] 1    1    2    2    3    <NA>
# Levels: 1 2 3 <NA>

这基本上是一个带有exclude = NULL的分解因子的简便函数。 来自 help(factor) -

addNA 可以通过将 NA 转换为额外的水平来修改因子(例如,这样可以在表格中计算 NA 值)。

因此,这个函数很好的原因之一是,如果您已经有了一个因子 f,则可以使用 addNA() 快速将 NA 添加为因子级别,而不更改 f。如文档中所述,这对于制作表格非常方便,也很易于阅读。


我使用了addNA。如何将它转换为字符串,就像其他级别一样?因为我的级别看起来像这样“1”“2”“3” NA,我希望它变成“1”“2”“3”“NA”。 - HonestRlover.not.

26
你可以使用forcats包中的fct_explicit_na<NA>作为一个级别添加,并将级别名称更改为比<NA>更明确的内容。
library(forcats)

默认情况下,您将得到新级别为(Missing)

fct_explicit_na(a)

[1] 1         1         2         2         3         (Missing)
Levels: 1 2 3 (Missing)
您可以将其设置为其他内容:
fct_explicit_na(a, "unknown")

[1] 1       1       2       2       3       unknown
Levels: 1 2 3 unknown

2
此函数已被取代,应使用 fct_na_value_to_level 代替(自 forcats 1.0.0 起)。 - Maël

21

将排除参数设置为NULL,以将NA包含在水平中(并使用factor而不是as.factor。这样做的效果相同,并具有更多要设置的参数):

将排除参数设置为NULL,以将NA包含在级别中(并使用factor而不是as.factor。这样做的效果相同,并具有更多要设置的参数):

a = factor(as.character(c(1, 1, 2, 2, 3, NA)), exclude = NULL)

> a
[1] 1    1    2    2    3    <NA>
Levels: 1 2 3 <NA>

2
这是使用ggplot绘图时,想要对因子水平进行排序的更好选择 :) - tjebo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接