【问题标题】:Recode empty string with dplyr::recode使用 dplyr::recode 重新编码空字符串
【发布时间】:2018-02-27 10:32:14
【问题描述】:

考虑这些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),也不会删除每个未使用的级别。

【问题讨论】:

    标签: r string dplyr na recode


    【解决方案1】:

    我们在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]
    

    【讨论】:

    • 这会丢弃所有未使用的关卡,不是吗?我需要保留重新编码方案中未提及的未使用级别,否则我可以使用droplevels。
    • @LAP 是的,没错,但这不是问题
    • 问题是将数据中出现的"" 的任何情况重新编码为NA 并从factor 项目中删除此特定级别,而不会删除所有未使用的级别。我会在我的问题中澄清它。
    • @LAP 请让它成为一个更一般的案例。你有一个很大的例子。使其简短而笼统
    • 这可能是最简单的解决方案,谢谢。虽然recode 无法解决这个问题,但我很烦。
    猜你喜欢
    • 2022-01-23
    • 2018-04-14
    • 2018-04-07
    • 2019-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-06
    相关资源
    最近更新 更多