如何将多份年度Excel数据框合并为单个tibble?是否适用join函数?
解决方案:纵向堆叠数据集而非使用join函数
你不需要使用join类函数——这类函数的作用是横向关联不同数据集的列(比如根据共同的Code列把不同表的信息拼到同一行),而你需要的是将结构相似的数据集纵向堆叠(把不同年份的行合并到同一个表中),正确的做法是用bind_rows()(或批量处理的方式)完成合并,再按年份排序。
具体步骤与代码示例
方法1:逐个处理后合并
先给每个数据框添加对应的年份列,再合并排序:
library(dplyr) library(readxl) library(tibble) # 读取数据并添加年份列 book_15 <- read_excel("data/book_15.xlsx") %>% mutate(year = 2015) book_16 <- read_excel("data/book_16.xlsx") %>% mutate(year = 2016) book_17 <- read_excel("data/book_17.xlsx") %>% mutate(year = 2017) book_18 <- read_excel("data/book_18.xlsx") %>% mutate(year = 2018) book_19 <- read_excel("data/book_19.xlsx") %>% mutate(year = 2019) # 合并并按年份排序,转为tibble combined_books <- bind_rows(book_15, book_16, book_17, book_18, book_19) %>% arrange(year) %>% as_tibble()
方法2:批量处理(更高效,避免重复代码)
利用purrr包的批量函数,一次性完成读取、加年份、合并:
library(dplyr) library(readxl) library(tibble) library(purrr) # 构建文件路径和对应年份的列表 file_paths <- paste0("data/book_", 15:19, ".xlsx") years <- 2015:2019 # 批量读取数据、添加年份列并合并 combined_books <- map2_dfr(file_paths, years, function(file, y) { read_excel(file) %>% mutate(year = y) }) %>% arrange(year)
为什么不用join函数?
join系列函数(如left_join()、inner_join())的核心是基于共同列匹配行,横向扩展列数——比如你有一个表存Code和2015年数据,另一个表存Code和2016年数据,用join可以把两年的数据拼到同一行。但你的需求是把所有年份的行放在同一个表中,列结构完全一致,这种场景下bind_rows()才是合适的工具。
内容的提问来源于stack exchange,提问作者Henry Oufh
相关产品推荐
相关产品推荐

