Подтвердить что ты не робот

Чтение всех рабочих листов в книге Excel в списке R с помощью data.frames

Я понимаю, что XLConnect можно использовать для чтения листа Excel в R. Например, это прочитало бы первый рабочий лист в книге под названием test.xls в R.

library(XLConnect)
readWorksheetFromFile('test.xls', sheet = 1)

У меня есть книга Excel с несколькими рабочими листами.

Как все рабочие листы в рабочей книге будут импортированы в список в R, где каждый элемент списка является data.frame для данного листа и где имя каждого элемента соответствует имени рабочего листа в Excel?

4b9b3361

Ответ 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 уже будет именованным списком.

Ответ 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")