考虑这些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
中所示),也不会丢弃每个未使用的级别。答案 0 :(得分:1)
我们在levels
之前将""
NA
分配给recode
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
这里&#39; c&#39;和&#39; a&#39;是未使用的级别,而&#39; b&#39;已更改为NA
以及""
至NA
set.seed(24)
x1 <- factor(sample(c(letters[1:5], ""), 20, replace = TRUE))
x2 <- x1[1:7]