R: простой способ экспортировать несколько data.frame в несколько таблиц Excel?

Я удивлен, обнаружив, что нет простого способа экспортировать несколько data.frame в несколько листов Excel файла? Я попробовал xlsx-пакет, кажется, что он может писать только на один лист (переопределить старый лист); Я также попробовал пакет WriteXLS, но он все время дает мне ошибку …

Моя структура кода такова: по дизайну для каждой итерации выходной файл (tempTable) и sheetName (sn) обновлялись и экспортировались в одну вкладку.

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

Я могу экспортировать в несколько файлов cvs, но должен быть простой способ сделать это в excel, не так ли?

Заранее спасибо.

8 Solutions collect form web for “R: простой способ экспортировать несколько data.frame в несколько таблиц Excel?”

Вы можете написать несколько листов с пакетом xlsx . Вам просто нужно использовать другое имя sheetName для каждого фрейма данных, и вам нужно добавить 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) 

Другой вариант, который дает вам больше контроля над форматированием и где размещается кадр данных, заключается в том, чтобы делать все в коде R / xlsx, а затем сохранять книгу в конце. Например:

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

В случае, если вы можете найти это полезным, вот некоторые интересные вспомогательные функции, которые упрощают добавление форматирования, метаданных и других функций в электронные таблицы с помощью xlsx : http://www.sthda.com/english/wiki/r2excel-read- написать-и-формат-легко-Excel-файлы, используя-р-программное обеспечение

Вы также можете использовать библиотеку openxlsx для экспорта нескольких наборов данных на несколько листов в одной книге. Преимущество openxlsx над xlsx заключается в том, что openxlsx удаляет зависимости от java-библиотек.

Напишите список data.frames для отдельных листов, используя имена списков в качестве имен рабочих листов.

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

Я не знаком с пакетом WriteXLS ; Обычно я использую 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) то 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) 

Это, безусловно, может быть векторизованным, как отмечалось выше, как @joran, но только для быстрого создания динамических имен листов я использовал цикл for для демонстрации.

Я использовал аргумент create=TRUE в loadWorkbook так как я создавал новый .xlsx-файл, но если ваш файл уже существует, вам не нужно указывать его, поскольку значение по умолчанию FALSE .

Вот несколько скриншотов созданной книги:

введите описание изображения здесь

введите описание изображения здесь

введите описание изображения здесь

В городе есть новая библиотека, от rOpenSci: writexl

Портативный, легкий блок данных для xlsx экспортера на основе libxlsxwriter. Нет необходимости в Java или Excel

Я нашел это лучше и быстрее, чем приведенные выше предложения (работа с версией dev):

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

Здесь много хороших ответов, но некоторые из них немного устарели. Если вы хотите добавить дополнительные листы в один файл, то это подход, который я нахожу для меня. Для ясности здесь приведен рабочий процесс для openxlsx версии 4.0

 # 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") 

РЕДАКТИРОВАТЬ

Теперь я попробовал несколько других ответов, и мне действительно нравится @ Syed's. Он не использует все функции openxlsx но если вы хотите быстрый и простой способ экспорта, то это, вероятно, самый простой.

Размер данных incase невелик, R имеет множество пакетов и функций, которые могут быть использованы в соответствии с вашим требованием.

write.xlsx, write.xlsx2, XLconnect также выполняют эту работу, но иногда они медленны по сравнению с openxlsx .

Итак, если вы имеете дело с большими наборами данных и сталкивались с ошибками Java. Я бы предложил посмотреть «openxlsx», который действительно потрясающий и сократить время до 1/12 .

Я тестировал все, и, наконец, я был впечатлен производительностью возможностей openxlsx.

Ниже приведены шаги для написания нескольких наборов данных на несколько листов.

  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») должен быть статическим, так как он требует ссылки на некоторую полезность из Rtools.

Примечание. Incase Rtools не установлен в вашей системе, сначала установите его для обеспечения плавного перехода. вот ссылка для вашей справки: (выберите соответствующую версию)

https://cran.r-project.org/bin/windows/Rtools/ проверьте параметры в соответствии со ссылкой ниже (необходимо установить флажок во время установки)

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 

Пакет openxlsx действительно хорош для чтения и записи огромных данных из / в excel-файлах и имеет множество опций для пользовательского форматирования в excel.

Интересным фактом является то, что мы не должны беспокоиться о памяти кучи java здесь.

Для меня WriteXLS предоставляет функциональность, которую вы ищете. Поскольку вы не указали, какие ошибки он возвращает, я покажу вам пример:

пример

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

объяснение

Если x :

  • список кадров данных, каждый из которых записывается на один лист
  • вектор символов (объектов R), каждый объект записывается на один лист
  • что-то другое, а затем посмотрите, что говорится в помощи:

Подробнее об использовании

 ?WriteXLS 

показывает:

 `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. 

Решение

Для вашего примера вам нужно будет собрать все data.frames в списке во время цикла и использовать WriteXLS после завершения цикла.

Информация о сеансе

  • R 3.2.4
  • WriteXLS 4.0.0

Я делаю это таким образом для openxlsx, используя следующую функцию

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

атрибут, зависящий от другого поля

Альтернативная альтернатива Acronis True Image

Используя средство командной строки cURL на Mac, что я могу сделать с этим скриптом, чтобы попросить его получить данные запаса, которые возвращаются без запятых?

Масштабирование шрифтов по ширине контейнера

Как приложение Metro в Windows 8 взаимодействует с настольным настольным окном на одном компьютере?

Поддержка NTFS для чтения / записи Mac OS X

Невозможно заставить Project Lombok работать над Eclipse (Helios)

Копирование данных с DVD с плохими секторами

Как использовать тернарный оператор внутри интерполированной строки?

Как мы можем восстановить (не возвращать) пароль маршрутизатора?

MVC Как отобразить изображение байтового массива из модели

Порядок выполнения тестов в TestNG

Открытие * .svg с IE9 вызывает диалог «Открыть, Сохранить как»

могу ли я запустить триггер для оператора select в mysql?

Что такое конечная точка веб-сервиса?

Давайте будем гением компьютера.