将 NA 转换为因子水平

Posted

技术标签:

【中文标题】将 NA 转换为因子水平【英文标题】:Convert NA into a factor level 【发布时间】:2015-01-27 13:03:03 【问题描述】:

我有一个带有 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

【问题讨论】:

您想在关卡和向量中保留NA 还是"NA"?也许,您可能想要的是paste,而不是as.character 【参考方案1】:

您可以使用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”不适用,我希望它是“1”“2”“3”“不适用”【参考方案2】:

您可以将 NA 添加为级别,并使用 forcats 包中的 fct_explicit_na 将级别名称更改为比 &lt;NA&gt; 更明确的名称。

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

【讨论】:

【参考方案3】:

将 exclude 参数设置为 NULL 以将 NA 包含为级别(并使用因子而不是 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>

【讨论】:

当您想订购因子水平以使用ggplot 进行绘图时,这是更好的选择:)

以上是关于将 NA 转换为因子水平的主要内容,如果未能解决你的问题,请参考以下文章

predict.lm() 在测试数据中具有未知因子水平

当值有太多有效数字时,read.csv 将数字转换为字符/因子

因子到目前为止转换产生NA [关闭]

分类 - 因子水平的使用

R语言数据预处理:将指定的分类变量转化为因子变量通过levels参数指定因子水平通过labels参数指定因子标签

R函数将多个因子水平定义为缺失