如何按列名前缀模式匹配选中多列并一次性替换因子水平
批量重编码同前缀因子列的解决方案
方案1:tidyverse 简洁实现
适配dplyr 1.0.0及以上版本,代码可读性高,逻辑清晰:
library(dplyr) df <- df %>% mutate( # 选中所有以q1a开头的列,批量执行重编码 across(starts_with("q1a"), ~ recode_factor(.x, `1` = "Yes", `2` = "No", `3` = "I don't know", `4` = "Maybe")) )
starts_with("q1a")是tidyselect提供的前缀匹配语法,比grepl逻辑更严谨,不会误选中列名中间包含q1a的列across()用于对选中的多列批量执行相同的处理逻辑
方案2:Base R 无依赖实现
不需要加载任何第三方包,用正则匹配+lapply循环实现:
# 匹配所有以q1a开头的列名 target_cols <- grep("^q1a", colnames(df), value = TRUE) # 批量重编码 df[target_cols] <- lapply(df[target_cols], function(x) { dplyr::recode_factor(x, `1` = "Yes", `2` = "No",`3` = "I don't know",`4` = "Maybe") })
如果完全不想依赖dplyr,纯base R修改因子水平的写法如下(前提是原有因子的水平顺序为1、2、3、4):
target_cols <- grep("^q1a", colnames(df), value = TRUE) df[target_cols] <- lapply(df[target_cols], function(x) { levels(x) <- c("Yes", "No", "I don't know", "Maybe") return(x) })
补充说明
- 若要保留未匹配到的原始值而非转为NA,可在
recode_factor中添加.default = as.character(.x)参数 - 若需同时处理多组不同前缀的列,修改匹配规则重复对应逻辑即可
内容的提问来源于stack exchange,提问作者Meli
相关产品推荐
相关产品推荐

