Чтение нескольких файлов xlsx каждый с несколькими листами - purrr - PullRequest
0 голосов
/ 01 июля 2018

У меня есть несколько файлов 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))

Создано в 2018-07-01 пакетом представ (v0.2.0).

1 Ответ

0 голосов
/ 01 июля 2018

Вы можете использовать вложенные вызовы map_df для замены цикла for. Насколько я знаю, map2 может работать только с двумя списками длины n и возвращать список длиной 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")
...