用 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,因为我想在可能具有我需要保留的空类别的变量上使用该函数。

需要提供的解决方案:

  1. 将出现的任何 "" 重新编码为 NA
  2. 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]