首页 > 解决方案 > fct_collapse 函数一次到多个列

问题描述

我有一个数据集,其中是/否变量都已作为自由文本(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")

但我想这将需要很多行代码。是否可以使用带有应用函数的一行代码来完成它,或者结合使用 mutate 来完成?

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

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)

标签: rrefactoringforcats

解决方案


我们可以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

推荐阅读