read_excel
принимает другой аргумент, позволяющий указать конкретный лист:
sheet: Sheet to read. Either a string (the name of a sheet), or an
integer (the position of the sheet). Ignored if the sheet is
specified via 'range'. If neither argument specifies the
sheet, defaults to the first sheet.
При этом нам нужно расширить ваш кадр путей, включив в него листы, что легко сделать с помощью readxl::excel_sheets
, который для одного пути возвращает вектор имен листов.
Итеративно, для обсуждения / прохождения, хотя требуется только последний блок:
library(tibble)
library(dplyr)
library(tidyr)
library(purrr)
library(readxl)
data_frame(
path = list.files(path = "~/StackOverflow/Prah/", pattern = "*.xlsx", full.names = TRUE)
) %>%
mutate(sheets = map(path, excel_sheets))
# # A tibble: 3 x 2
# path sheets
# <chr> <list>
# 1 "C:\\Users\\r2/StackOverflow/Prah/mt1.xlsx" <chr [2]>
# 2 "C:\\Users\\r2/StackOverflow/Prah/mt2.xlsx" <chr [2]>
# 3 "C:\\Users\\r2/StackOverflow/Prah/mt3.xlsx" <chr [2]>
Это само по себе не очень полезно, но мы можем unnest
это:
data_frame(
path = list.files(path = "~/StackOverflow/Prah/", pattern = "*.xlsx", full.names = TRUE)
) %>%
mutate(sheets = map(path, excel_sheets)) %>%
unnest(sheets)
# # A tibble: 6 x 2
# path sheets
# <chr> <chr>
# 1 "C:\\Users\\r2/StackOverflow/Prah/mt1.xlsx" Sheet1
# 2 "C:\\Users\\r2/StackOverflow/Prah/mt1.xlsx" Sheet2
# 3 "C:\\Users\\r2/StackOverflow/Prah/mt2.xlsx" Sheet1
# 4 "C:\\Users\\r2/StackOverflow/Prah/mt2.xlsx" Sheet2
# 5 "C:\\Users\\r2/StackOverflow/Prah/mt3.xlsx" Sheet1
# 6 "C:\\Users\\r2/StackOverflow/Prah/mt3.xlsx" Sheet2
Теперь должно стать ясно, что теперь нам просто нужно перебрать каждую строку, используя map2
или аналогичный, и мы получим вложенный аккуратный кадр с данными:
data_frame(
path = list.files(path = "~/StackOverflow/Prah/", pattern = "*.xlsx", full.names = TRUE)
) %>%
mutate(sheets = map(path, excel_sheets)) %>%
unnest(sheets) %>%
mutate(data = map2(path, sheets, ~ read_excel(path = .x, sheet = .y)))
# # A tibble: 6 x 3
# path sheets data
# <chr> <chr> <list>
# 1 "C:\\Users\\r2/StackOverflow/Prah/mt1.xlsx" Sheet1 <tibble [32 x 11]>
# 2 "C:\\Users\\r2/StackOverflow/Prah/mt1.xlsx" Sheet2 <tibble [32 x 11]>
# 3 "C:\\Users\\r2/StackOverflow/Prah/mt2.xlsx" Sheet1 <tibble [32 x 11]>
# 4 "C:\\Users\\r2/StackOverflow/Prah/mt2.xlsx" Sheet2 <tibble [32 x 11]>
# 5 "C:\\Users\\r2/StackOverflow/Prah/mt3.xlsx" Sheet1 <tibble [32 x 11]>
# 6 "C:\\Users\\r2/StackOverflow/Prah/mt3.xlsx" Sheet2 <tibble [32 x 11]>
(Я сделал несколько книг Excel, каждая из которых имела два листа, на каждом листе было mtcars
. Ничего особенного.)