如果级别可用,请重新编码因子

问题描述 投票:0回答:1

我有一个由调查现场创建的数据集,他们为一些标签引入了大写撇号。 当我使用 Haven 包导入它时,那些大写撇号仍然保留。 我想将它们全部替换为直撇号。 在理想的情况下,这将为所有这些撇号完成,但如果我这样做,它会改变所有级别的顺序,这是我想避免的事情。

因此,作为第二种解决方案,我想将所有因素(例如“不知道”)更改为“不知道”(或者为了便于使用,现在更改为“DK”)。

当我使用 mutate_if 时,当该级别不存在时我会收到一条警告消息(这很公平)。

tbl_dat <- tibble(var01 = factor(c("Don’t know", "Cat 1")),
              var02 = factor(c("No answer", "Cat 2")))

tbl_dat <- tbl_dat %>% 
  mutate_if(is.factor,
            fct_recode,
            "DK" = "Don’t know")

警告

Warning in `mutate()`:
ℹ In argument: `var01 = (function (.f, ...) ...`.
Caused by warning:
! Unknown levels in `f`: Don’t know

如何保持因子水平(即不将其更改为字符,然后返回因子),但在所有变量上执行此操作,而不必预先选择具有该水平的变量?在理想情况下,我不想忽略或抑制警告,而是首先避免它们。

r dplyr tidyverse tidyr r-haven
1个回答
0
投票

您可以通过检查每个因子列中是否有水平来解决此问题:

tbl_dat %>%
  mutate(across(where(is.factor), ~ if ("Don’t know" %in% levels(.)) {
    fct_recode(., "DK" = "Don’t know")
  } else {.}
  ))

#   var01 var02    
#   <fct> <fct>    
# 1 DK    No answer
# 2 Cat 1 Cat 2  
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.