将NA转换为因子级别

mar*_*bel 33 r missing-data

我有一个带有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
Run Code Online (Sandbox Code Playgroud)

这有效,但这似乎是一种奇怪的方式.

a = as.factor(ifelse(is.na(a), "NA", a))
class(a)
[1] "factor"
Run Code Online (Sandbox Code Playgroud)

这是预期的输出:

a
[1] 1  1  2  2  3  NA
Levels: 1 2 3 NA
Run Code Online (Sandbox Code Playgroud)

Ric*_*ven 50

你也可以使用addNA().

x <- c(1, 1, 2, 2, 3, NA)
addNA(x)
# [1] 1    1    2    2    3    <NA>
# Levels: 1 2 3 <NA>
Run Code Online (Sandbox Code Playgroud)

这基本上是用于分解的便利功能exclude = NULL.来自help(factor)-

addNA通过转换NA为额外级别来修改因子(NA例如,在表中计算值).

所以另一个原因很好,因为如果你已经有一个因素f,你可以使用addNA()快速添加NA作为因子水平而不改变f.如文档中所述,这对表格很方便.它也读得很好.


Lyz*_*deR 17

将exclude参数设置为NULL以包含NAs作为级别(并使用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>
Run Code Online (Sandbox Code Playgroud)

  • 当您想要订购因子级别以使用“ggplot”进行绘图时,这是更好的选择:) (2认同)

aos*_*ith 16

您可以将NA添加为级别,并将级别名称更改为比<NA>使用fct_explicit_napackage forcats更明确的名称.

library(forcats)
Run Code Online (Sandbox Code Playgroud)

默认情况下,您将获得以下新级别(Missing):

fct_explicit_na(a)

[1] 1         1         2         2         3         (Missing)
Levels: 1 2 3 (Missing)
Run Code Online (Sandbox Code Playgroud)

您可以将其设置为其他内容:

fct_explicit_na(a, "unknown")

[1] 1       1       2       2       3       unknown
Levels: 1 2 3 unknown
Run Code Online (Sandbox Code Playgroud)

  • 该函数现已被取代,应该使用“fct_na_value_to_level”代替(来自“forcats 1.0.0”) (3认同)