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

加载相关R包

1
2
3
# 加载相关R包
library(readxl)
library(tidyverse)

从一个工作簿的n个工作表提取数据

1
2
3
4
5
6
7
8
file_path = "path/to/file.xlsx"  # 这里也可以是file.xls文件
sheet_names = excel_sheets(file_path)
names(sheet_names) = sheet_names  # 给每个对象赋值一个名字
df = map_dfr(
  sheet_names,
  ~read_excel(file_path, sheet = .),
  .id = "source"  # 提取数据后加入一列数据来源
  )

从n个工作簿中提取数据

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
files_path = list.files(
  "path/to/", 
  pattern = "\\.xlsx$",  # 这里也可以是.xls文件
  full.names = TRUE)  
names(files_path) = files_path # 给每个对象赋值一个名字
df = map_dfr(
  files_path,  
  ~read_excel(., skip = <m>),  # 表头上面往往有标题、单位等要素,需要跳过m行
  .id = "source"  # 提取数据后加入一列数据来源
  )