r - Как читать данные из нескольких рабочих книг, имеющих несколько рабочих листов в R? - PullRequest
0 голосов
/ 03 января 2019

Я пытаюсь прочитать данные из нескольких рабочих книг с несколькими рабочими листами с использованием r. Существует 10 рабочих книг, каждая из которых содержит данные в двух рабочих листах.

Следующий код работает при извлечении данных с первого листа. Однако я хотел бы также перетащить данные на другой лист в той же книге. Я не уверен, как указать имя листа в следующем коде.

library(purrr)
library(readxl)
library(dplyr)
library(tidyr)

data_path <- "C:/Desktop/Test"

files <- dir(data_path, pattern = "*.xlsx")


weights_data <- data.frame(filename = files) %>%
               mutate(file_contents = map(filename,
                                                 ~ read_excel(file.path
                                                              (data_path,  .))))

View(unnest(weights_Data))

1 Ответ

0 голосов
/ 03 января 2019

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. Ничего особенного.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...