如何更高效提取前缀为abc_的R数据框共列并纵向合并?
更简洁高效的R实现方案:筛选指定前缀数据框并合并共有列
问题背景
现有R环境中的数据框如下:
abc_1 <- data.frame(col1 = 1:5, col2 = 6:10, col3 = 11:15) abc_2 <- data.frame(col1 = 21:25, col2 = 26:30, col4 = 31:35) abc_3 <- data.frame(col1 = 41:45, col2 = 46:50, col5 = 51:55) def_1 <- data.frame(col1 = 61:65, col2 = 66:70, col6 = 71:75)
需求:筛选所有以abc_开头的数据框,识别它们的共有列,再按共有列执行纵向合并(rbind)。原实现代码已完成需求,现寻求更简洁高效的写法。
方法一:Base R 简化版
利用mget直接批量获取匹配前缀的对象,减少中间变量的同时让逻辑更紧凑:
# 批量获取所有abc_开头的数据框 abc_dfs <- mget(ls(pattern = "^abc_")) # 提取共有列名 common_cols <- Reduce(intersect, lapply(abc_dfs, colnames)) # 按共有列合并 combined_df <- do.call(rbind, lapply(abc_dfs, function(df) df[, common_cols, drop = FALSE]))
简化点说明
- 用
ls(pattern = "^abc_")直接过滤出目标对象名,替代单独的grep操作 - 用
mget一次性获取所有目标数据框,避免重复调用get - 整体代码更紧凑,逻辑连贯
方法二:Tidyverse 管道化实现
如果习惯使用tidyverse生态,用purrr和dplyr的管道操作可以让代码更易读:
library(tidyverse) combined_df <- mget(ls(pattern = "^abc_")) %>% # 计算所有数据框的共有列 {map(., colnames) %>% reduce(intersect)} %>% # 给每个数据框只保留共有列 map(select, .x = abc_dfs, .) %>% # 纵向合并所有数据框 bind_rows()
或者更紧凑的写法:
combined_df <- mget(ls(pattern = "^abc_")) %>% map(select, intersect(!!!map(., colnames))) %>% bind_rows()
优势说明
- 管道操作让数据处理流程一目了然,从筛选到合并一步到位
select和bind_rows替代了base R的索引和do.call(rbind),代码更语义化
内容的提问来源于stack exchange,提问作者farrow90
相关产品推荐
相关产品推荐

