读取多个 xlsx 文件,每个文件都有多个工作表 - purrr
Reading multiple xlsx files each with multiple sheets - purrr
我有多个 excel 文件,每个文件都有不同的工作表。我曾尝试使用 readxl 和 map 将其导入 R。但是,我只能使用 for 循环来完成。下面的代码工作正常,但我想知道是否有聪明的方法来做到这一点。我一直在想我可以用 map2 做到这一点,但我遗漏了一些东西。
library(tidyverse)
library(readxl)
library(writexl)
### As a first step, I get all the files from my project folder and create an empty list for looping purposes
files <- list.files(pattern = ".xlsx")
data_xlsx <- list()
### I then use seq_along in all the files and map_df to read the each excel file
for (i in seq_along(files)) {
data_xlsx[[i]] <- files[i] %>%
excel_sheets() %>%
set_names() %>%
map_df(
~ read_xlsx(path = files[i], sheet = .x, range = "H3"),
.id = "sheet")
}
# I use the code below to get the files name into the list
data_xlsx <- set_names(data_xlsx, files)
# This final code is just to transform the list into a data frame with a column with the name of the files
data_xlsx_df <- map2_df(data_xlsx, files, ~update_list(.x, file = .y))
由 reprex package (v0.2.0) 创建于 2018-07-01。
您可以使用嵌套的 map_df
调用来替换 for 循环。据我所知,map2
只能对长度为 n
的两个列表和 return 长度为 n
的列表进行操作,我认为这不是生成来自长度为 n
和 m
.
的两个列表的长度 n * m
列表
files <- list.files(pattern = ".xlsx")
data_xlsx_df <- map_df(set_names(files), function(file) {
file %>%
excel_sheets() %>%
set_names() %>%
map_df(
~ read_xlsx(path = file, sheet = .x, range = "H3"),
.id = "sheet")
}, .id = "file")
我有多个 excel 文件,每个文件都有不同的工作表。我曾尝试使用 readxl 和 map 将其导入 R。但是,我只能使用 for 循环来完成。下面的代码工作正常,但我想知道是否有聪明的方法来做到这一点。我一直在想我可以用 map2 做到这一点,但我遗漏了一些东西。
library(tidyverse)
library(readxl)
library(writexl)
### As a first step, I get all the files from my project folder and create an empty list for looping purposes
files <- list.files(pattern = ".xlsx")
data_xlsx <- list()
### I then use seq_along in all the files and map_df to read the each excel file
for (i in seq_along(files)) {
data_xlsx[[i]] <- files[i] %>%
excel_sheets() %>%
set_names() %>%
map_df(
~ read_xlsx(path = files[i], sheet = .x, range = "H3"),
.id = "sheet")
}
# I use the code below to get the files name into the list
data_xlsx <- set_names(data_xlsx, files)
# This final code is just to transform the list into a data frame with a column with the name of the files
data_xlsx_df <- map2_df(data_xlsx, files, ~update_list(.x, file = .y))
由 reprex package (v0.2.0) 创建于 2018-07-01。
您可以使用嵌套的 map_df
调用来替换 for 循环。据我所知,map2
只能对长度为 n
的两个列表和 return 长度为 n
的列表进行操作,我认为这不是生成来自长度为 n
和 m
.
n * m
列表
files <- list.files(pattern = ".xlsx")
data_xlsx_df <- map_df(set_names(files), function(file) {
file %>%
excel_sheets() %>%
set_names() %>%
map_df(
~ read_xlsx(path = file, sheet = .x, range = "H3"),
.id = "sheet")
}, .id = "file")