R: ¿forma fácil de exportar múltiples data.frame a múltiples hojas de cálculo de Excel?

Me sorprende descubrir que no existe una forma fácil de exportar múltiples data.frame a varias hojas de trabajo de un archivo de Excel. Intenté el paquete xlsx, parece que solo puede escribir en una hoja (anular la hoja anterior); También probé el paquete WriteXLS, pero me da error todo el tiempo …

Mi estructura de código es así: por diseño, para cada iteración, el dataframe de salida (tempTable) y el sheetName (sn) se actualizaron y se exportaron a una sola pestaña.

for (i in 2 : ncol(code)){ ... tempTable <- ... sn <- ... WriteXLS("tempTable", ExcelFileName = "C:/R_code/../file.xlsx", SheetNames = sn); } 

Puedo exportar a varios archivos cvs, pero tiene que haber una manera fácil de hacerlo en Excel, ¿verdad?

Gracias por adelantado.

Puede escribir en varias hojas con el paquete xlsx . Solo necesita usar un sheetName diferente para cada dataframe y debe agregar append=TRUE :

 library(xlsx) write.xlsx(dataframe1, file="filename.xlsx", sheetName="sheet1", row.names=FALSE) write.xlsx(dataframe2, file="filename.xlsx", sheetName="sheet2", append=TRUE, row.names=FALSE) 

Otra opción, una que le da más control sobre el formateo y dónde se coloca el dataframe, es hacer todo dentro del código R / xlsx y luego guardar el libro de trabajo al final. Por ejemplo:

 wb = createWorkbook() sheet = createSheet(wb, "Sheet 1") addDataFrame(dataframe1, sheet=sheet, startColumn=1, row.names=FALSE) addDataFrame(dataframe2, sheet=sheet, startColumn=10, row.names=FALSE) sheet = createSheet(wb, "Sheet 2") addDataFrame(dataframe3, sheet=sheet, startColumn=1, row.names=FALSE) saveWorkbook(wb, "My_File.xlsx") 

En caso de que le resulte útil, aquí hay algunas funciones de ayuda interesantes que hacen que sea más fácil agregar formato, metadatos y otras características a las hojas de cálculo usando xlsx : http://www.sthda.com/english/wiki/r2excel-read- write-and-format-easily-excel-files-using-r-software

También puede usar la biblioteca de openxlsx para exportar conjuntos de datos múltiples a varias hojas en un solo libro de trabajo. La ventaja de openxlsx sobre xlsx es que openxlsx elimina las dependencias de las bibliotecas de Java.

Escriba una lista de marcos de datos en hojas de trabajo individuales usando nombres de listas como nombres de hojas de trabajo.

 require(openxlsx) list_of_datasets < - list("Name of DataSheet1" = dataframe1, "Name of Datasheet2" = dataframe2) write.xlsx(list_of_datasets, file = "writeXLSX2.xlsx") 

No estoy familiarizado con el paquete WriteXLS ; Generalmente uso XLConnect :

 library(XLConnect) ## newWB < - loadWorkbook( filename="F:/TempDir/tempwb.xlsx", create=TRUE) ## for(i in 1:10){ wsName <- paste0("newsheet",i) createSheet( newWB, name=wsName) ## writeWorksheet( newWB, data=data.frame( X=1:10, Dataframe=paste0("DF ",i)), sheet=wsName, header=TRUE, rownames=NULL) } saveWorkbook(newWB) 

Esto ciertamente puede ser vectorizado, como @joran se mencionó anteriormente, pero solo por el hecho de generar nombres de hoja dynamics rápidamente, utilicé un ciclo for para demostrarlo.

Utilicé el argumento create=TRUE en loadWorkbook porque estaba creando un nuevo archivo .xlsx, pero si su archivo ya existe, entonces no tiene que especificarlo, ya que el valor predeterminado es FALSE .

Aquí hay algunas capturas de pantalla del libro de trabajo creado:

enter image description here

enter image description here

enter image description here

Hay una nueva biblioteca en la ciudad, de rOpenSci: writexl

Marco de datos portátil y liviano para el exportador xlsx basado en libxlsxwriter. No se requiere Java o Excel

Lo encontré mejor y más rápido que las sugerencias anteriores (trabajando con la versión dev):

 library(writexl) sheets < - list("sheet1Name" = sheet1, "sheet2Name" = sheet2) #assume sheet1 and sheet2 are data frames write_xlsx(sheets, "path/to/location") 

Muchas buenas respuestas aquí, pero algunas de ellas son un poco anticuadas. Si desea agregar más hojas de trabajo a un solo archivo, este es el enfoque que creo que funciona para mí. Para mayor claridad, aquí está el flujo de trabajo para la versión 4.0 de openxlsx

 # Create a blank workbook OUT < - createWorkbook() # Add some sheets to the workbook addWorksheet(OUT, "Sheet 1 Name") addWorksheet(OUT, "Sheet 2 Name") # Write the data to the sheets writeData(OUT, sheet = "Sheet 1 Name", x = dataframe1) writeData(OUT, sheet = "Sheet 2 Name", x = dataframe2) # Export the file saveWorkbook(OUT, "My output file.xlsx") 

EDITAR

Ahora he probado algunas otras respuestas, y realmente me gusta mucho Syed's. No explota toda la funcionalidad de openxlsx pero si quiere un método de exportación rápido y fácil, probablemente sea el más sencillo.

En caso de que el tamaño de los datos sea pequeño, R tiene muchos paquetes y funciones que pueden utilizarse según sus necesidades.

write.xlsx, write.xlsx2, XLconnect también hacen el trabajo, pero a veces son lentas en comparación con openxlsx .

Por lo tanto, si se trata de grandes conjuntos de datos y se encontró con errores de Java. Sugeriría echarle un vistazo a “openxlsx”, que es realmente increíble y reducir el tiempo a 1/12 .

Lo probé todo y finalmente quedé realmente impresionado con el rendimiento de las capacidades de openxlsx.

Estos son los pasos para escribir múltiples conjuntos de datos en varias hojas.

  install.packages("openxlsx") library("openxlsx") start.time < - Sys.time() # Creating large data frame x <- as.data.frame(matrix(1:4000000,200000,20)) y <- as.data.frame(matrix(1:4000000,200000,20)) z <- as.data.frame(matrix(1:4000000,200000,20)) # Creating a workbook wb <- createWorkbook("Example.xlsx") Sys.setenv("R_ZIPCMD" = "C:/Rtools/bin/zip.exe") ## path to zip.exe 

Sys.setenv ("R_ZIPCMD" = "C: /Rtools/bin/zip.exe") tiene que ser estático ya que toma referencia de alguna utilidad de Rtools.

Nota: Incase Rtools no está instalado en su sistema, instálelo primero para una experiencia fluida. aquí está el enlace para su referencia: (elija la versión apropiada)

https://cran.r-project.org/bin/windows/Rtools/ verifique las opciones según el siguiente enlace (debe seleccionar toda la checkbox durante la instalación)

https://cloud.githubusercontent.com/assets/7400673/12230758/99fb2202-b8a6-11e5-82e6-836159440831.png

  # Adding a worksheets : parameters for addWorksheet are 1. Workbook Name 2. Sheet Name addWorksheet(wb, "Sheet 1") addWorksheet(wb, "Sheet 2") addWorksheet(wb, "Sheet 3") # Writing data in to respetive sheets: parameters for writeData are 1. Workbook Name 2. Sheet index/ sheet name 3. dataframe name writeData(wb, 1, x) # incase you would like to write sheet with filter available for ease of access you can pass the parameter withFilter = TRUE in writeData function. writeData(wb, 2, x = y, withFilter = TRUE) ## Similarly writeDataTable is another way for representing your data with table formatting: writeDataTable(wb, 3, z) saveWorkbook(wb, file = "Example.xlsx", overwrite = TRUE) end.time < - Sys.time() time.taken <- end.time - start.time time.taken 

El paquete openxlsx es realmente bueno para leer y escribir datos enormes desde / en archivos de Excel y tiene muchas opciones para el formateo personalizado dentro de Excel.

El hecho interesante es que no tenemos que preocuparnos por la memoria del montón de Java aquí.

Para mí, WriteXLS proporciona la funcionalidad que estás buscando. Como no especificó los errores que devuelve, le muestro un ejemplo:

Ejemplo

 library(WriteXLS) x < - list(sheet_a = data.frame(a=letters), sheet_b = data.frame(b = LETTERS)) WriteXLS(x, "test.xlsx", names(x)) 

Explicación

Si x es:

  • una lista de marcos de datos, cada uno escrito en una sola hoja
  • un vector de caracteres (de objetos R), cada objeto se escribe en una sola hoja
  • algo más, luego vea también lo que dice la ayuda:

Más sobre el uso

 ?WriteXLS 

muestra:

 `x`: A character vector or factor containing the names of one or more R data frames; A character vector or factor containing the name of a single list which contains one or more R data frames; a single list object of one or more data frames; a single data frame object. 

Solución

Para su ejemplo, deberá recostackr todos los data.frames en una lista durante el ciclo, y usar WriteXLS después de que el ciclo haya finalizado.

Información de la sesión

  • R 3.2.4
  • WriteXLS 4.0.0

Lo hago de esta manera para openxlsx usando la siguiente función

 mywritexlsx< -function(fname="temp.xlsx",sheetname="Sheet1",data, startCol = 1, startRow = 1, colNames = TRUE, rowNames = FALSE) { if(! file.exists(fname)) wb = createWorkbook() else wb <- loadWorkbook(file =fname) sheet = addWorksheet(wb, sheetname) writeData(wb,sheet,data,startCol = startCol, startRow = startRow, colNames = colNames, rowNames = rowNames) saveWorkbook(wb, fname,overwrite = TRUE) }