考虑以下factor对象:
x <- factor(c(1,2,2,4,5), 1:5, labels = c('Ja', 'Nein', '', 'Weiß nicht', 'Keine Antwort'))
y <- factor(c(1:5), 1:5, labels = c('Ja', 'Nein', '', 'Weiß nicht', 'Keine Antwort'))
> table(x)
x
Ja Nein Weiß nicht Keine Antwort
1 2 0 1 1
> table(y)
y
Ja Nein Weiß nicht Keine Antwort
1 1 1 1 1 我试图使用dplyr::recode对各种变量进行重新编码。我无法获得将空字符串级别重新编码到NA和删除特定因素级别的函数。
使用
dplyr::recode(x,
"Weiß nicht" = NA_character_,
"Weiß nicht " = NA_character_,
"Keine Antwort" = NA_character_,
"Keine Antwort " = NA_character_,
"k.A." = NA_character_,
"Keine Angabe" = NA_character_,
"0" = NA_character_,
"" = NA_character_)将导致错误消息(Error: attempt to use zero-length variable name)。使用
z <- dplyr::recode(na_if(x, ""),
"Weiß nicht" = NA_character_,
"Weiß nicht " = NA_character_,
"Keine Antwort" = NA_character_,
"Keine Antwort " = NA_character_,
"k.A." = NA_character_,
"Keine Angabe" = NA_character_,
"0" = NA_character_)正如在Recode character vector with some empty strings中所描述的,没有消除空字符串级别:
> table(z)
z
Ja Nein
1 2 0
> levels(z)
[1] "Ja" "Nein" "" 此外,我不能简单地使用droplevels,因为我想对可能有需要保留的空类别的变量使用函数。
需要有一个解决方案来解决以下问题:
""的发生记录为NA。""从factor变量中删除,即使它是未使用的(如x中的),而不删除所有未使用的级别。发布于 2018-02-27 10:34:42
我们将属于""的""分配给recode之前的NA
levels(x)[levels(x)==""] <- NA_character_
y <- dplyr::recode(x,
"Weiß nicht" = NA_character_,
"Weiß nicht " = NA_character_,
"Keine Antwort" = NA_character_,
"Keine Antwort " = NA_character_,
"k.A." = NA_character_,
"Keine Angabe" = NA_character_,
"0" = NA_character_))
levels(y)
#[1] "Ja" "Nein"
table(y)
y
# Ja Nein
# 23 2728 使用较小的数据集
x2 <- x1[1:7]
levels(x2)[levels(x2)==""] <- NA_character_
x2
#[1] b b e d d <NA> b
#Levels: a b c d e
table(dplyr::recode(x2, "b" = NA_character_))
# a c d e
# 0 0 2 1 这里的'c‘和'a’是未使用的级别,而'b‘则改为NA,而""改为NA。
数据
set.seed(24)
x1 <- factor(sample(c(letters[1:5], ""), 20, replace = TRUE))
x2 <- x1[1:7]https://stackoverflow.com/questions/49006519
复制相似问题