使用dplyr :: recode重新编码空字符串

时间:2018-02-27 10:32:15

标签: r string dplyr na 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_)
Recode character vector with some empty strings中描述的

没有消除空字符串级别:

> table(z)
z
  Ja Nein      
   1    2    0 
> levels(z)
[1] "Ja"   "Nein" "" 

此外,我不能简单地使用droplevels,因为我想对可能有我需要保留的空类别的变量使用该函数。

解决方案需要提供给事物:

  1. 重新编码""NA的任何出现。
  2. ""变量中删除级别factor,即使它未被使用(如x中所示),也不会丢弃每个未使用的级别。

1 个答案:

答案 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]