【问题标题】:Convert NA into a factor level将 NA 转换为因子水平
【发布时间】: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

标签: r missing-data


【解决方案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 进行绘图时,这是更好的选择:)
    猜你喜欢
    • 1970-01-01
    • 2017-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-07
    相关资源
    最近更新 更多