如何用Purrr的reduce合并R中data.frame对象?合并失败求助
问题原因与解决办法
你的代码失败的核心原因:ls(pattern='data')拿到的是对象名称的字符串,转成list后还是一堆字符串,并不是实际的data.frame对象。reduce调用rbind时,没法对字符串执行合并操作,自然报错。
下面是几种便捷的解决方式:
方法1:用mget直接获取数据框列表(推荐)
mget可以根据字符串向量,批量取出对应的对象,直接得到data.frame组成的列表,再合并就没问题了:
library(tidyverse) # 你的测试数据生成代码(保留) for (i in c(1:20)){ assign(paste0('data_',i),data.frame(category=c('a','b'),sales=c(1,2))) } # 精准匹配data_开头加数字的对象,避免误抓其他含data的对象 data_list <- mget(ls(pattern='^data_\\d+$')) # 用reduce合并,或者直接用tidyverse的bind_rows更高效 data_total <- reduce(data_list, rbind) # 更简洁的写法: # data_total <- bind_rows(data_list)
方法2:用get配合map转换字符串到对象
如果习惯用map操作,可以先拿到对象名字符串,再逐个用get取出实际对象:
objects <- ls(pattern='^data_\\d+$') data_list <- map(objects, get) data_total <- reduce(data_list, rbind)
补充说明
- 用
^data_\\d+$作为匹配模式,是为了精准匹配data_1到data_20这类对象,避免误匹配其他名字里带data的对象(比如如果有个叫data_temp的变量,就不会被抓进来)。 bind_rows是tidyverse提供的合并函数,比基础的rbind更灵活,能自动处理列名不一致的情况,推荐使用。
内容的提问来源于stack exchange,提问作者anderwyang
相关产品推荐
相关产品推荐

