Leggi tutti i fogli di lavoro in una cartella di lavoro di Excel in un elenco R con data.frames

Capisco che XLConnect può essere usato per leggere un foglio di lavoro Excel in R. Ad esempio, questo leggerà il primo foglio di lavoro in una cartella di lavoro chiamata test.xls in R.

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

Ho una cartella di lavoro di Excel con più fogli di lavoro.

Come possono essere importati tutti i fogli di lavoro di una cartella di lavoro in un elenco in R in cui ogni elemento della lista è un data.frame per un determinato foglio e dove il nome di ciascun elemento corrisponde al nome del foglio di lavoro in Excel?

Risposta aggiornata usando readxl (22 giugno 2015)

Da quando readxl postato questa domanda è stato rilasciato il pacchetto readxl . Supporta sia il formato xls che xlsx . È importante sottolineare che, a differenza di altri pacchetti di importazione Excel, funziona su Windows, Mac e Linux senza richiedere l’installazione di software aggiuntivo.

Quindi una funzione per importare tutti i fogli in una cartella di lavoro di Excel sarebbe:

 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 } 

Questo potrebbe essere chiamato con:

 mysheets <- read_excel_allsheets("foo.xls") 

Vecchia risposta

Basandosi sulla risposta fornita da @mnel, ecco una semplice funzione che prende un file Excel come argomento e restituisce ogni foglio come un data.frame in una lista nominata.

 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)}) } 

Quindi, potrebbe essere chiamato con:

 importWorksheets('test.xls') 

Nota che la maggior parte delle funzioni di XLConnect sono già vettorizzate. Ciò significa che è ansible leggere tutti i fogli di lavoro con una chiamata di funzione senza dover esplicitare la vettorizzazione:

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

Con XLConnect 0.2-0 lst sarà già una lista nominata.

È ansible caricare il libro di lavoro e quindi usare lapply , getSheets e readWorksheet e fare qualcosa di simile.

 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)}) 

Dal momento che questo è il numero uno della domanda: Leggi il multifoglio excel alla lista:

ecco la soluzione openxlsx :

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

excel.link farà il lavoro.

In realtà ho trovato più facile da usare rispetto a XLConnect (non che entrambi i pacchetti siano così difficili da usare). La curva di apprendimento per entrambi era di circa 5 minuti.

Per inciso, puoi facilmente trovare tutti i pacchetti R che menzionano la parola “Excel” sfogliando http://cran.r-project.org/web/packages/available_packages_by_name.html

Mi sono imbattuto in questa vecchia domanda e penso che manchi ancora l’approccio più semplice.

Puoi usare rio per importare tutti i fogli Excel con una sola riga di codice.

 library(rio) data_list <- import_list("test.xls") 

Se sei un fan del tidyverse , puoi facilmente importarli come tibbles aggiungendo l'argomento setclass alla chiamata della funzione.

 data_list <- import_list("test.xls", setclass = "tbl") 

Dalla documentazione ufficiale di readxl (tidyverse) (che modifica la prima riga):

 path <- "data/datasets.xlsx" path %>% excel_sheets() %>% set_names() %>% map(read_excel, path = path) 

Dettagli su: http://readxl.tidyverse.org/articles/articles/readxl-workflows.html#iterate-over-multiple-worksheets-in-a-workbook

Ho provato quanto sopra e ha avuto problemi con la quantità di dati che il mio 20MB Excel di cui avevo bisogno per convertire consisteva in; quindi quanto sopra non ha funzionato per me.

Dopo ulteriori ricerche mi sono imbattuto in openxlsx e questo finalmente ha fatto il trucco (e veloce) importando un grosso file xlsx in R?

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

Per leggere più fogli da una cartella di lavoro, utilizzare il pacchetto readxl come segue:

 library(readxl) library(dplyr) final_dataFrame <- bind_row(path_to_workbook %>% excel_sheets() %>% set_names() %>% map(read_excel, path = path_to_workbook)) 

Qui, bind_row (dplyr) metterà tutte le righe di dati da tutti i fogli in un frame di dati, e path_to_workbook è “dir / of / the / data / cartella di lavoro”.