用 dplyr::recode 重新编码空字符串
Recode empty string with dplyr::recode
考虑这些 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_)
如所述不去掉空串级别:
> table(z)
z
Ja Nein
1 2 0
> levels(z)
[1] "Ja" "Nein" ""
此外,我不能简单地使用 droplevels
,因为我想在可能具有我需要保留的空类别的变量上使用该函数。
需要提供的解决方案:
- 将出现的任何
""
重新编码为 NA
。
- 从
factor
变量中降低等级 ""
,即使它未使用(如 x
),但不降低 每个 未使用的等级.
我们在 recode
之前将 ""
的 levels
分配给 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]
考虑这些 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_)
如
> table(z)
z
Ja Nein
1 2 0
> levels(z)
[1] "Ja" "Nein" ""
此外,我不能简单地使用 droplevels
,因为我想在可能具有我需要保留的空类别的变量上使用该函数。
需要提供的解决方案:
- 将出现的任何
""
重新编码为NA
。 - 从
factor
变量中降低等级""
,即使它未使用(如x
),但不降低 每个 未使用的等级.
我们在 recode
""
的 levels
分配给 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]