导入包含多个 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
部分添加了这两列,file
和 sheet
,并分配了path
和 sheet,即 .x
。
希望这对您有所帮助。
我正在尝试上传多个 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
部分添加了这两列,file
和 sheet
,并分配了path
和 sheet,即 .x
。
希望这对您有所帮助。