You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 10:02:24