Чтение всех рабочих листов в книге Excel в списке R с помощью data.frames
Я понимаю, что XLConnect
можно использовать для чтения листа Excel в R. Например, это прочитало бы первый рабочий лист в книге под названием test.xls
в R.
library(XLConnect)
readWorksheetFromFile('test.xls', sheet = 1)
У меня есть книга Excel с несколькими рабочими листами.
Как все рабочие листы в рабочей книге будут импортированы в список в R, где каждый элемент списка является data.frame для данного листа и где имя каждого элемента соответствует имени рабочего листа в Excel?
Ответы
Ответ 1
Обновленный ответ с использованием readxl (22 июня 2015 г.)
После публикации этого вопроса пакет readxl
был выпущен. Он поддерживает как xls
и xlsx
формат. Важно отметить, что в отличие от других пакетов импорта Excel, он работает в Windows, Mac и Linux, не требуя установки дополнительного программного обеспечения.
Таким образом, функция для импорта всех листов в книге Excel будет:
library(readxl)
read_excel_allsheets <- function(filename, tibble = FALSE) {
# I prefer straight data.frames
# but if you like tidyverse tibbles (the default with read_excel)
# then just pass tibble = TRUE
sheets <- readxl::excel_sheets(filename)
x <- lapply(sheets, function(X) readxl::read_excel(filename, sheet = X))
if(!tibble) x <- lapply(x, as.data.frame)
names(x) <- sheets
x
}
Это можно вызвать с помощью:
mysheets <- read_excel_allsheets("foo.xls")
Старый ответ
Основываясь на ответе, предоставленном @mnel, вот простая функция, которая принимает файл Excel в качестве аргумента и возвращает каждый лист как data.frame в именованном списке.
library(XLConnect)
importWorksheets <- function(filename) {
# filename: name of Excel file
workbook <- loadWorkbook(filename)
sheet_names <- getSheets(workbook)
names(sheet_names) <- sheet_names
sheet_list <- lapply(sheet_names, function(.sheet){
readWorksheet(object=workbook, .sheet)})
}
Таким образом, его можно вызвать с помощью:
importWorksheets('test.xls')
Ответ 2
Обратите внимание, что большинство функций XLConnect уже векторизованы. Это означает, что вы можете читать во всех листах с помощью одного вызова функции без необходимости явной векторизации:
require(XLConnect)
wb <- loadWorkbook(system.file("demoFiles/mtcars.xlsx", package = "XLConnect"))
lst = readWorksheet(wb, sheet = getSheets(wb))
С XLConnect 0.2-0 lst уже будет именованным списком.
Ответ 3
Из официальной документации readxl
(tidyverse) (с изменением первой строки):
path <- "data/datasets.xlsx"
path %>%
excel_sheets() %>%
set_names() %>%
map(read_excel, path = path)
Подробности на: http://readxl.tidyverse.org/articles/articles/readxl-workflows.html#iterate-over-multiple-worksheets-in-a-workbook
Ответ 4
Я наткнулся на этот старый вопрос и думаю, что самый простой подход все еще отсутствует.
Вы можете использовать rio
для импорта всех листов Excel, используя всего одну строку кода.
library(rio)
data_list <- import_list("test.xls")
Если вы являетесь поклонником tidyverse
, вы можете легко импортировать их как тиблы, добавив аргумент setclass
в вызов функции.
data_list <- import_list("test.xls", setclass = "tbl")
Предположим, что они имеют одинаковый формат, вы можете легко связать их, установив для аргумента rbind
значение TRUE
.
data_list <- import_list("test.xls", setclass = "tbl", rbind = TRUE)
Ответ 5
Так как это вопрос номер один, прочитайте Excel на листе:
вот решение openxlsx
:
filename <-"myFilePath"
sheets <- openxlsx::getSheetNames(filename)
SheetList <- lapply(sheets,openxlsx::read.xlsx,xlsxFile=filename)
names(SheetList) <- sheets
Ответ 6
Вы можете загрузить рабочую книгу, а затем использовать lapply
, getSheets
и readWorksheet
и сделать что-то вроде этого.
wb.mtcars <- loadWorkbook(system.file("demoFiles/mtcars.xlsx",
package = "XLConnect"))
sheet_names <- getSheets(wb.mtcars)
names(sheet_names) <- sheet_names
sheet_list <- lapply(sheet_names, function(.sheet){
readWorksheet(object=wb.mtcars, .sheet)})
Ответ 7
excel.link выполнит эту работу.
На самом деле мне было проще использовать его по сравнению с XLConnect (не так сложно использовать любой пакет). Кривая обучения для обоих составляла около 5 минут.
В стороне, вы можете легко найти все R-пакеты, которые упоминают слово "Excel", просматривая
http://cran.r-project.org/web/packages/available_packages_by_name.html
Ответ 8
Чтобы прочитать несколько листов из книги, используйте пакет readxl следующим образом:
library(readxl)
library(dplyr)
final_dataFrame <- bind_row(path_to_workbook %>%
excel_sheets() %>%
set_names() %>%
map(read_excel, path = path_to_workbook))
Здесь bind_row (dplyr) поместит все строки данных из всех листов в один фрейм данных, а path_to_workbook будет "dir/of/the/data/workbook".
Ответ 9
Я попробовал вышеуказанное и имел проблемы с объемом данных, которые мой 20 МБ Excel, который мне нужен для преобразования, состоял из; поэтому вышеупомянутое не помогло мне.
После нескольких исследований я наткнулся на openxlsx, и этот, наконец, сделал трюк (и быстро)
Импорт большого файла xlsx в R?
https://cran.r-project.org/web/packages/openxlsx/openxlsx.pdf
Ответ 10
Метод rio
потрясающий !! Прост в использовании и может легко приспособиться к таким инструментам, как tidyverse
и dplyr
.
Ответ 11
Добавляю Павлу ответ. Листы также могут быть объединены, используя что-то вроде этого:
data = path %>%
excel_sheets() %>%
set_names() %>%
map_df(~ read_excel(path = path, sheet = .x), .id = "Sheet")
Необходимые библиотеки:
if(!require(pacman))install.packages("pacman")
pacman::p_load("tidyverse","readxl","purrr")