fct_collapse一次对多个列起作用

fct_collapse function to multiple columns at once

我得到了一个数据集,其中是/否变量都已作为自由文本 (facepalm) 输入。

起初我尝试将 fct_collapse 函数应用于数据框中的每个单独的列,但考虑到有 50 多列带有是和否,这需要大量编码。

pid = c(1,2,3,4,5)
a = c("y", "Y", "no", "no", "NO")
b = c("yes", "Y", "y", "no", "n")
c = c("Y", "no", "n", "no", "No")
df <- data.frame(a,b,c)

我试过了

df$a <- fct_collapse(df$a, yes = c("y", "Y"), no = c("no", "NO")

但我想这将需要很多行代码。有没有可能用一行代码加上一个apply函数或者mutate结合across就可以做到?

编辑:我正在寻找的输出是

a2 = c("yes", "yes", "no", "no", "no")
b2 = c("yes", "yes", "yes", "no", "no")
c2 = c("yes", "no", "no", "no", "no")
df2 <- data.frame(pid,a2,b2,c2)

我们可以使用 across 遍历列

library(dplyr)
library(forcats)
df %>% 
    mutate(across(-pid, ~ fct_collapse(.,
     yes = c('y', 'Y'), no = c('no', 'NO', 'n'))))

-输出

#   pid   a   b   c
#1   1 yes yes yes
#2   2 yes yes  no
#3   3  no yes  no
#4   4  no  no  no
#5   5  no  no  No

一个简单的解决方案是像这样使用 mgsub

mgsub::mgsub(df, 
             c("Y", "yes", "y", "n", "NO", "no", "No"), 
             c("yes", "yes", "yes", "no", "no", "no", "no"))

输出

  pid   a   b   c
1   1 yes yes yes
2   2 yes yes  no
3   3  no yes  no
4   4  no  no  no
5   5  no  no  no