是否有用于替换 tidyverse 中的因子水平的矢量化方法

Is there a vectorized method for replacing factor levels in tidyverse

我希望能够通过用变量(列)的名称替换其中一个水平来有效地重新编码数据框的大量变量(列)的因子水平。

Health <- tibble(Anemia = c("yes", "no", "no"), 
BloodPressure = c("no", "yes", "no"),
Asthma = c("no", "no", "yes"))

我希望输出看起来像这样

Health2 <- tibble(Anemia = c("Anemia", "no", "no"), 
BloodPressure = c("no", "BloodPressure", "no"), 
Asthmal = c("no", "no", "Asthma"))

我想要此输出而无需手动更改每个级别,因为我有一个数据库,其中包含 100 个左右的变量,我必须重新编码。我试图创建一个函数来执行此操作

Med_rename <- function(x) {
  levels = c(no = "no", names(x) ="yes")
  fct_recode(x, !!!levels)
}

Med_rename2 <- function(x) {
  y = names(x)
  levels = c(no = "no", y ="yes")
  fct_recode(x, !!!levels)
}

但是这些尝试中的任何一个或其他使用矢量化尝试替换级别的尝试的输出都不会用变量(列)名称替换“是”。是否有另一种矢量化方法可以将“是”替换为列名并应用于大量变量?

可以在dplyr中使用cur_column(),使用列名替换。

library(dplyr)

Health %>% mutate(across(.fns = ~replace(., . == 'yes', cur_column())))

#  Anemia BloodPressure Asthma
#  <chr>  <chr>         <chr> 
#1 Anemia no            no    
#2 no     BloodPressure no    
#3 no     no            Asthma

在基础 R 中,lapply :

Health[] <- lapply(names(Health), function(x) 
                   replace(Health[[x]], Health[[x]] == 'yes', x))