【发布时间】:2014-08-18 00:38:17
【问题描述】:
我有一个数据集,其中一列的因子水平为"a" "b" "c" "NotPerformed"。如何将所有 "NotPerformed" 因素更改为 NA?
【问题讨论】:
我有一个数据集,其中一列的因子水平为"a" "b" "c" "NotPerformed"。如何将所有 "NotPerformed" 因素更改为 NA?
【问题讨论】:
将级别设置为 NA:
x <- factor(c("a", "b", "c", "NotPerformed"))
x
## [1] a b c NotPerformed
## Levels: a b c NotPerformed
levels(x)[levels(x)=='NotPerformed'] <- NA
x
## [1] a b c <NA>
## Levels: a b c
请注意,因子水平已被删除。
【讨论】:
x[x=="NotPerformed"] <- NA 将用NA 替换值,但它不会删除'NotPerformed' 因子级别。这就是为什么这种方法更可取的原因。
我修改了我的旧答案,并提供了截至 2016 年 9 月您可以做什么。随着 dplyr 软件包的开发,现在您可以使用 recode_factor() 来完成这项工作。
x <- factor(c("a", "b", "c", "NotPerformed"))
# [1] a b c NotPerformed
# Levels: a b c NotPerformed
library(dplyr)
recode_factor(x, NotPerformed = NA_character_)
# [1] a b c <NA>
# Levels: a b c
【讨论】:
forcats 包:fct_recode(x, NULL = "NotPerformed")。
或者简单地使用内置的exclude 选项,无论初始变量是字符还是因子,它都有效。
x <- c("a", "b", "c", "NotPerformed")
factor(x, exclude = "NotPerformed")
[1] a b c <NA>
Levels: a b c
factor(factor(x), exclude = "NotPerformed")
[1] a b c <NA>
Levels: a b c
【讨论】:
将级别之一设置为NA 到tidyverse 管道、%>%。
这可能更适合作为评论,但我没有那么多声誉。
在我的例子中,income 变量是int,其值为c(1:7, 9)。其中,“9”代表“不想回答”。
## when all int should be fctr
New_data <- data %>% mutate_if(is.integer, as.factor) %>%
mutate(income = fct_recode(income, NULL = "9"))
我也试过recode(),还是不行。
【讨论】: