将 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
将级别名称更改为比 <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
【讨论】:
【参考方案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 转换为因子水平的主要内容,如果未能解决你的问题,请参考以下文章
当值有太多有效数字时,read.csv 将数字转换为字符/因子