在R中合并30+个Excel工作簿Metadata表的优化方案求助
解决方案
核心思路是避开反复行合并的低效操作,先将每个Metadata表转成单行长格式,再合并后转置得到目标结构:
步骤1:批量读取并转换单个Metadata表
每个Metadata表只有20行两列,我们可以把它转换成1行多列的格式,同时保留工作簿名称作为后续列的标识:
library(readxl) library(purrr) library(dplyr) library(tidyr) # 获取所有Excel文件路径(假设都在当前工作目录) excel_paths <- list.files(pattern = "\\.xlsx$", full.names = TRUE) # 定义处理单个Excel的函数 process_metadata <- function(path) { # 读取Metadata表 meta_df <- read_excel(path, sheet = "Metadata") # 转成宽格式:1行,列名为Dataset View Id的内容,值为第二列 meta_wide <- meta_df %>% pivot_wider(names_from = `Dataset View Id`, values_from = 2) %>% # 添加工作簿名称作为标识 mutate(workbook = basename(path)) %>% # 把标识列放最前面 select(workbook, everything()) return(meta_wide) } # 批量处理所有文件 all_meta_wide <- map_dfr(excel_paths, process_metadata)
步骤2:转置得到目标汇总表
现在all_meta_wide是30行(对应30个工作簿)、21列(1个标识列+20个描述项列),我们只需要转置就能得到用户需要的结构:
summary_table <- all_meta_wide %>% # 转置,把描述项作为行,工作簿作为列 pivot_longer(-workbook, names_to = "Dataset View Id", values_to = "value") %>% pivot_wider(names_from = workbook, values_from = "value") %>% # 确保Dataset View Id列在最前面 select(`Dataset View Id`, everything())
为什么这个方法更高效?
- 每个Metadata表仅转换为1行,30个表合并后仅30行,内存占用可以忽略
- 避免了
merge/full_join反复进行行匹配的计算开销,不会出现内存溢出或崩溃问题
内容的提问来源于stack exchange,提问作者PK82
相关产品推荐
相关产品推荐

