首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用dplyr::recode记录空字符串

用dplyr::recode记录空字符串
EN

Stack Overflow用户
提问于 2018-02-27 10:32:14
回答 1查看 1K关注 0票数 2

考虑以下factor对象:

代码语言:javascript
复制
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和删除特定因素级别的函数。

使用

代码语言:javascript
复制
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)。使用

代码语言:javascript
复制
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中所描述的,没有消除空字符串级别:

代码语言:javascript
复制
> table(z)
z
  Ja Nein      
   1    2    0 
> levels(z)
[1] "Ja"   "Nein" "" 

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

需要有一个解决方案来解决以下问题:

  1. ""的发生记录为NA
  2. 将级别""factor变量中删除,即使它是未使用的(如x中的),而不删除所有未使用的级别。
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-27 10:34:42

我们将属于""""分配给recode之前的NA

代码语言:javascript
复制
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 

使用较小的数据集

代码语言:javascript
复制
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

数据

代码语言:javascript
复制
set.seed(24)
x1 <- factor(sample(c(letters[1:5], ""), 20, replace = TRUE))
x2 <- x1[1:7]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49006519

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档