Прочитайте всі аркуші книги Excel у список R із data.frames


78

Я розумію, що XLConnectйого можна використовувати для читання аркуша Excel у R. Наприклад, це буде читати перший аркуш у книзі, що називається test.xlsR.

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

У мене є книжка Excel із декількома аркушами.

Як можна імпортувати всі аркуші з книги до списку в R, де кожен елемент списку є data.frame для даного аркуша, і де ім'я кожного елемента відповідає назві аркуша в Excel?


окрім xlconnectі readxl, пакет xlsxдозволяє обробляти файли Excel у R(всі аркуші або лише деякі)
Cath

Дуже хороший підручник: dominicroye.github.io/en/2019/import-excel-sheets-with-r
Tung

Відповіді:


116

Оновлена ​​відповідь за допомогою 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')

відмінно, просто навчання, яке readxlмає excel_sheetsметод. чудово.
MichaelChirico

1
@ user7071759 якщо я вас розумію, то ви просто зможете включити шлях до filename. Наприклад, read_excel_allsheets ("my / path / to / file / example.xls")
Джеромі Англім,

1
Здається, ця нова відповідь дає мені список у списку, а не фрейм даних у списку.
Хелен

4
Я отримую списки, а не фрейми даних.
J Walt,

1
Була б простіша версія цієї функції lapply(excel_sheets(file.path), function(x) read_excel(file.path, x)). Якщо вам більше до вподоби, просто оберніть read_excel as.data.frame(). Імена потрібно було б присвоювати після.
glaucon

45

Зверніть увагу, що більшість функцій XLConnect вже векторизовані. Це означає, що ви можете читати всі робочі аркуші за допомогою одного виклику функції без необхідності робити явну векторизацію:

require(XLConnect)
wb <- loadWorkbook(system.file("demoFiles/mtcars.xlsx", package = "XLConnect"))
lst = readWorksheet(wb, sheet = getSheets(wb))

З XLConnect 0,2-0 lst вже буде названим списком.


11
Для мене це працює require(XLConnect) wb <- loadWorkbook("excel.xlsx") lst = readWorksheet(wb, sheet = getSheets(wb))
Кім Стек

3
Я також. Відповідь на рішення не спрацювала для мене, не вдалося знайти файл, хоча він існує
Z_D

2
Дзвінок із system.file()не спрацював і для мене.
Нікос Александріс

натомість використовуючи loadWorkbook (system.file ("demoFiles / mtcars.xlsx", package = "XLConnect")), безпосередньо використовуйте loadWorkbook ("demoFiles / mtcars.xlsx") для завантаження книги. Це працює.
Казі

23

Я наткнувся на це старе питання, і думаю, що найпростіший підхід все ще бракує.

Ви можете використовувати 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)

2
rio::import_list- чудовий варіант. Він також може імпортувати підмножину аркушів, наприклад, import_list("test.xls", which = c(1, 2))що може бути дійсно корисним. Я згоден, що тут це найпростіший варіант.
Денні

@Danny, я не знав про whichсуперечку. Це справді могло б стати в нагоді.
j3ypi

22

З офіційної 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


2
Щоб зберегти імена аркушів,df <- path %>% excel_sheets() %>% set_names() %>% map_dfr(read_excel, path = path, .id = "SheetName")
Тунг,

13

Оскільки це перше звернення до запитання: Прочитайте багато аркушів Excel до списку:

ось openxlsxрішення:

filename <-"myFilePath"

sheets <- openxlsx::getSheetNames(filename)
SheetList <- lapply(sheets,openxlsx::read.xlsx,xlsxFile=filename)
names(SheetList) <- sheets

7

Ви можете завантажити робочу книгу , а потім використовувати 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)})

Хороший Мартін !!
ASH

4

Щоб прочитати кілька аркушів із книги, використовуйте пакет readxl наступним чином:

library(readxl)
library(dplyr)

final_dataFrame <- bind_rows(path_to_workbook %>%
                              excel_sheets() %>%
                              set_names() %>%
                              map(read_excel, path = path_to_workbook))

Тут bind_rows ( dplyr) помістить усі рядки даних з усіх аркушів в один фрейм даних і path_to_workbookбуде розташуванням ваших даних: "dir / of / the / data / workbook".


3

excel.link зробить цю роботу.

Я насправді виявив, що це простіше у використанні порівняно з XLConnect (не те, що будь-який пакет настільки складний у використанні). Крива навчання для обох становила близько 5 хвилин.

Окрім того, ви можете легко знайти всі пакети R, в яких згадується слово "Excel", перейшовши за адресою http://cran.r-project.org/web/packages/available_packages_by_name.html


1

Я спробував вищезазначене і мав проблеми з обсягом даних, який мій 20-МБ Excel мені потрібно було перетворити; тому вищезазначене для мене не працювало.

Після подальших досліджень я натрапив на openxlsx, і цей нарешті зробив фокус (і швидко) Імпортуючи великий файл xlsx у R?

https://cran.r-project.org/web/packages/openxlsx/openxlsx.pdf


1

Додаючи до відповіді Павла. Аркуші також можна об’єднати, використовуючи щось подібне:

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")
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.