楚新元 | All in R

Welcome to R Square

从 n 个 Excel 工作表或工作簿汇总数据

楚新元 / 2021-08-23


工作中常常遇到需要从 n 个工作簿(Workbook)中汇总数据,或者从一个工作簿中的 n 个工作表(Worksheet)中汇总数据到一张表中,而每个工作簿或工作表中的数据结构相同。如果 n 超过 3,那么我绝对不会考虑 Ctrl + CCtrl + V,一来这种方式会有操作风险,二来重复性的干同一件事一点儿也不优雅,像个机器人。下面给出优雅的实现方式,相信 n 很大的时候你会深刻体会到什么叫优雅。

加载相关 R 包

library(readxl)
library(purrr)

从 n 个工作簿汇总数据

file_list = list.files(
  "path/to/", 
  pattern = "\\.xlsx$",  # 这里也可以是 .xls 文件
  full.names = TRUE
)
map_dfr(
  set_names(file_list),
  ~ read_excel(., skip = m),  # 表头上面往往有标题、单位等要素,需要跳过 m 行
  .id = "src"
) -> df

从一个工作簿的 n 个工作表汇总数据

file_path = "path/to/file.xlsx"  # 这里也可以是 .xls 文件
map_dfr(
  set_names(excel_sheets(file_path)) ,
  ~ read_excel(file_path, sheet = .x),
  .id = "src"  # 提取数据后加入一列数据来源
) -> df

从 n 个工作簿的 n 的工作表汇总数据

file_list = list.files(
  "path/to/",  
  pattern = "\\.xlsx$",  # 这里也可以是 .xls 文件
  full.names = TRUE
)
read_path = function(path) {
  map_dfr(
    excel_sheets(path), 
    ~ read_excel(path, sheet = .x, skip = m)
  )
}
df = map_dfr(file_list, read_path)

文章参考了张敬信老师的知乎博文,在此向张老师表示感谢。