如何在多数据框列表中基于变量名前缀合并列并移除冗余列
解决方案
可以用dplyr配合purrr实现批量处理,核心思路是先写一个处理单个数据框的函数,再批量应用到列表中的所有数据框上,一步完成值替换和冗余列移除。
步骤1:编写单个数据框的处理函数
这个函数会自动识别Duo:开头的列,用其非NA值覆盖对应目标列,最后删除所有Duo:列:
library(dplyr) process_single_df <- function(df) { # 筛选所有以"Duo:"开头的列 duo_cols <- grep("^Duo:", names(df), value = TRUE) if (length(duo_cols) == 0) return(df) # 没有Duo列直接返回原数据 # 提取对应的目标列名(去掉"Duo:"前缀) target_cols <- sub("^Duo:", "", duo_cols) # 只保留存在对应目标列的Duo列,避免报错 valid_indices <- target_cols %in% names(df) duo_cols <- duo_cols[valid_indices] target_cols <- target_cols[valid_indices] # 循环替换目标列:用Duo列的非NA值覆盖原列,原列NA则保留Duo值 for (i in seq_along(duo_cols)) { df <- df %>% mutate(!!target_cols[i] := coalesce(!!sym(duo_cols[i]), !!sym(target_cols[i]))) } # 删除所有Duo开头的冗余列 df %>% select(-all_of(duo_cols)) }
步骤2:批量处理列表中的所有数据框
用purrr::map遍历列表,把上面的函数应用到每个数据框:
library(purrr) # 示例数据列表 df_list <- list( df1 = tibble(side = c(NA, "right", "top"), value = 1:3, `Duo:side` = c("left", NA, "bottom")), df2 = tibble(size = c("small", NA, "large"), weight = 4:6, `Duo:size` = c(NA, "medium", NA)) ) # 批量处理 processed_df_list <- map(df_list, process_single_df)
关键细节说明
coalesce(a, b)函数会返回第一个非NA值,完美匹配需求:如果Duo:列有值就用它,否则保留原目标列的值!!sym(col_name)用来将字符串格式的列名转换为dplyr能识别的变量,实现动态列操作- 加入了目标列存在性检查,避免因
Duo:列无对应目标列而报错 - 整个流程一步完成替换和删列,无需单独处理冗余列
内容的提问来源于stack exchange,提问作者Rara
相关产品推荐
相关产品推荐

