writeworksheet - Lea todas las hojas de trabajo en un libro de Excel en una lista R con data.frames
xlconnect download (9)
Entiendo que XLConnect
se puede usar para leer una hoja de cálculo de Excel en R. Por ejemplo, esto leería la primera hoja de trabajo en un libro llamado test.xls
en R.
library(XLConnect)
readWorksheetFromFile(''test.xls'', sheet = 1)
Tengo un Excel Workbook con múltiples hojas de trabajo.
¿Cómo se pueden importar todas las hojas de trabajo en un libro en una lista en R donde cada elemento de la lista es un marco de datos para una hoja determinada, y donde el nombre de cada elemento corresponde al nombre de la hoja de cálculo en Excel?
Respuesta actualizada utilizando readxl (22 de junio de 2015)
Desde que se publicó esta pregunta, se readxl
paquete readxl
. Admite los formatos xls
y xlsx
. Es importante destacar que, a diferencia de otros paquetes de importación de excel, funciona en Windows, Mac y Linux sin requerir la instalación de software adicional.
Entonces, una función para importar todas las hojas en un libro de Excel sería:
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
}
Esto podría ser llamado con:
mysheets <- read_excel_allsheets("foo.xls")
Vieja respuesta
Sobre la base de la respuesta proporcionada por @mnel, aquí hay una función simple que toma un archivo Excel como argumento y devuelve cada hoja como un data.frame en una lista con nombre.
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)})
}
Por lo tanto, podría llamarse con:
importWorksheets(''test.xls'')
Dado que este es el hit número uno a la pregunta: Leer hoja múltiple excel para enumerar:
aquí está la solución openxlsx
:
filename <-"myFilePath"
sheets <- openxlsx::getSheetNames(filename)
SheetList <- lapply(sheets,openxlsx::read.xlsx,xlsxFile=filename)
names(SheetList) <- sheets
De la documentación oficial de readxl
(tidyverse) (cambio de primera línea):
path <- "data/datasets.xlsx"
path %>%
excel_sheets() %>%
set_names() %>%
map(read_excel, path = path)
Detalles en: http://readxl.tidyverse.org/articles/articles/readxl-workflows.html#iterate-over-multiple-worksheets-in-a-workbook
Intenté lo anterior y tuve problemas con la cantidad de datos que mi Excel de 20 MB que necesitaba convertir consistía en; por lo tanto, lo anterior no funcionó para mí.
Después de más investigación tropecé con openxlsx y este finalmente hizo el truco (y rápido) Importar un gran archivo xlsx en R?
https://cran.r-project.org/web/packages/openxlsx/openxlsx.pdf
Me encontré con esta vieja pregunta y creo que el enfoque más fácil aún falta.
Puede usar rio
para importar todas las hojas de Excel con solo una línea de código.
library(rio)
data_list <- import_list("test.xls")
Si eres fanático de tidyverse
, puedes importarlos fácilmente como tibbles agregando el argumento setclass
a la llamada a la función.
data_list <- import_list("test.xls", setclass = "tbl")
Para leer varias hojas de un libro de trabajo, use el paquete readxl de la siguiente manera:
library(readxl)
library(dplyr)
final_dataFrame <- bind_row(path_to_workbook %>%
excel_sheets() %>%
set_names() %>%
map(read_excel, path = path_to_workbook))
Aquí, bind_row (dplyr) colocará todas las filas de datos de todas las hojas en un marco de datos, y path_to_workbook es "dir / of / the / data / workbook".
Puede cargar el libro de trabajo y luego usar lapply
, getSheets
y readWorksheet
y hacer algo como esto.
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)})
Tenga en cuenta que la mayoría de las funciones de XLConnect ya están vectorizadas. Esto significa que puede leer en todas las hojas de trabajo con una llamada de función sin tener que hacer una vectorización explícita:
require(XLConnect)
wb <- loadWorkbook(system.file("demoFiles/mtcars.xlsx", package = "XLConnect"))
lst = readWorksheet(wb, sheet = getSheets(wb))
Con XLConnect 0.2-0 lst ya será una lista con nombre.
excel.link hará el trabajo.
De hecho, me pareció más fácil de usar en comparación con XLConnect (no es que ninguno de los paquetes sea tan difícil de usar). La curva de aprendizaje para ambos fue de aproximadamente 5 minutos.
Como un aparte, puede encontrar fácilmente todos los paquetes R que mencionan la palabra "Excel" navegando a http://cran.r-project.org/web/packages/available_packages_by_name.html