在R中用grep提取数据框名并通过rbind批量合并数据框
解决方法
你的问题出在all_dat_df是存储数据框名称的字符向量,而rbind需要的是实际的数据框对象,直接传字符串肯定不行。下面是两种可行的解决方式:
方法一:base R原生方案
用mget把字符向量对应的实际数据框取出来,再通过do.call调用rbind完成合并:
mget(all_dat_df):根据字符串名称,把环境中对应的所有数据框提取为一个列表do.call(rbind, ...):将rbind函数批量应用到列表的每个元素上,实现合并
完整代码:
dat1lkq6 <- data.frame(color = c('COLOR: RED', 'COLOR: RED', 'COLOR: BLUE', 'COLOR: GREEN', 'COLOR: BLUE')) dat1ah2 <- data.frame(style = c('SPORTY', 'HYBRID', 'FORMAL', 'CASUAL', 'CASUAL')) dat29fg <- data.frame(color = c('COLOR: RED', 'COLOR: CYAN', 'COLOR: BLUE', 'COLOR: RED', 'COLOR: BLUE')) dat2xl <- data.frame(color = c('COLOR: RED', 'COLOR: CYAN', 'COLOR: BLUE', 'COLOR: RED', 'COLOR: BLUE')) dat3g49 <- data.frame(color = c('COLOR: PURPLE', 'COLOR: RED', 'COLOR: BLUE', 'COLOR: GREEN', 'COLOR: BLUE')) skus4 <- data.frame(sku = c('SKU: 1849354', 'SKU: 392856', 'SKU: 921385', 'SKU: 6395474', 'SKU: 8532449', 'SKU: 0285468', 'SKU: 2948327')) # 提取以dat开头的数据框名称 all_dat_df <- base::ls(all.names = TRUE)[base::grep("^dat", base::ls(all.names = TRUE))] # 合并数据框 merged_dat <- do.call(rbind, mget(all_dat_df)) # 验证结果:nrow(merged_dat) 会返回25,符合预期
方法二:tidyverse风格方案
如果你熟悉tidyverse工具链,可以用purrr包的map_dfr函数,一步完成提取+合并:
library(purrr) merged_dat <- map_dfr(all_dat_df, get)
注意事项
因为你的数据框列名不完全一致(比如dat1ah2只有style列,其余是color列),合并后缺失的列会自动填充NA,这是正常行为,最终结果依然会是25行。
内容的提问来源于stack exchange,提问作者seehorse
相关产品推荐
相关产品推荐

