导入包含多个 sheet 的多个 Excel 文件并根据 sheet 的名称创建新列

Importing multiple Excel files with multiple sheets and creating a new column based on sheet's names

我正在尝试上传多个 Excels 文件(相同格式),每个文件都有多个 sheets,实际上每个 Excel 文件都有关于酒店的信息bookings,每个sheet是一个月(f.ijan,feb,oct)的信息,每个文件是不同酒店名称的信息(f.ihilton,paris,Vac_in) 为了说明,假设我们在工作目录中有 2 个文件,第一个文件代表希尔顿酒店的预订,第二个文件代表巴黎酒店,文件一(希尔顿)有 3 个名为“jan”的 sheets "feb" 和 "mar" 文件 2(巴黎酒店)也是如此

每个 sheet(关于文件在.. 总是有相同的列名)所以在这个过程结束时我希望所有数据都导入一个完整的 dataframe 和我试图添加两个新列,一个是 excel 文件的名称,另一个是 sheet 的名称,它从类似这样的东西中获取信息:

ID COST "FILE NAME" "SHEET NAME"
A 5 Hilton Jan
X 8 Hilton Jan
B 1 Hilton Feb
C 2 Hilton Mar
R 59 Paris Jan
G 22 Paris Feb
U 10 Paris Mar
W 78 Paris Mar

我会得到上述期望的结果,因为第一个文件的名称为“Hilton”,并且在 sheet 中有 2 行信息,一个名为“Jan”,在 [=33= 中有一行信息] "Feb" 与第二个文件的名称为 "Paris" 并且有 sheets 命名为 Jan, Feb 并从中取出所有行并将其放入完整的 dataframe

我可以使用以下代码成功上传每个文件及其 sheet 的所有信息:

library(tidyverse)
library(fs)
library(readxl)

path <- fs::dir_ls(choose.dir())

read_all_files_&_sheets <- function(path) {
  path %>%
    excel_sheets() %>% 
    set_names() %>% 
    map_df(read_excel, path = path)
}

data <- path%>% 
  map(read_all_files_)

full_db<-bind_rows(data)

但我找不到改变和创建新列“FILE NAME”和“SHEET NAME”的方法我已经尝试了几个小时但我只得到错误,如果你可以帮助我或参考博客或书籍,我可以学习如何做,非常感谢

稍微改变一下你的功能如何,像这样:

read_all_files_<- function(path) {
  path %>% 
    excel_sheets() %>%
    set_names() %>% 
    map_df(~read_excel(.x, path = path) %>% mutate(file=path, sheet=.x))
}

解释:

假设您的路径向量(即路径 [1])中的第一个文件是 "<folder_structure>hilton.xlsx"。然后,当您将此字符串传递给 read_all_files_() 时,通过 set_names() 进行管道传输的结果是 sheets

的命名列表
  Jan   Feb   Mar 
"Jan" "Feb" "Mar" 

然后您将 这三个 sheet 名称 传递给 map_df()。虽然 map_df(read_excel, path=path) 将为您 return 数据,但您需要调整函数以额外改变 map_df() 将要 return 的帧。因此,我们将 .f=read_excel 改为 .f=~read_excel(.x, path=path) %>% mutate(....),其中 mutate 部分添加了这两列,filesheet,并分配了path 和 sheet,即 .x

希望这对您有所帮助。