Запись данных на указанный лист excel в r [duplicate]

На основе ответа ворона это решение заставляет работать кнопку RStudio Source.

При нажатии этой кнопки Source выполняется RStudio source('myfile.r', encoding = 'UTF-8') ]), поэтому переопределение source заставляет ошибки исчезать и запускает код, как ожидалось:

source <- function(f, encoding = 'UTF-8') {
    l <- readLines(f, encoding=encoding)
    eval(parse(text=l),envir=.GlobalEnv)
}

42
задан eipi10 4 February 2018 в 23:54
поделиться

8 ответов

Вы можете написать несколько листов с пакетом 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-write-and-format-easily-excel-files-using-r-software

82
ответ дан eipi10 15 August 2018 в 19:01
поделиться
  • 1
    xlsx не заботится о числах в первой строке R, помещенной там. openxlsx удалите их. – buhtz 15 August 2016 в 10:01
  • 2
    Добавьте row.names=FALSE, чтобы удалить имена строк. – eipi10 15 August 2016 в 15:08
  • 3
    @EcologyTom Я переключился с xlsx на openxlsx некоторое время назад, так как я нахожу его более интуитивным, а также избегает зависимости java. – eipi10 13 June 2018 в 15:06
  • 4
    Да, java-зависимость заставила меня сделать тот же самый переключатель. Хотя код немного длиннее, он довольно прост. Для метода с openxlsx версии 4.0 см. Мой дополнительный ответ ниже. – EcologyTom 14 June 2018 в 07:17

Много хороших ответов здесь, но некоторые из них немного устарели. Если вы хотите добавить дополнительные листы в один файл, то это подход, который я нахожу для меня. Для ясности здесь приведен рабочий процесс для 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")

EDIT

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

4
ответ дан EcologyTom 15 August 2018 в 19:01
поделиться

В городе есть новая библиотека, из 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")
7
ответ дан Giora Simchoni 15 August 2018 в 19:01
поделиться
  • 1
    Благодаря! Это работало там, где openxlsx не выполнял (я не могу установить rtools на работу). – Ape 9 November 2017 в 10:37
  • 2
    Какую версию вы используете для этого? По умолчанию загрузка cran не поддерживает несколько листов (пока): «Ошибка в writexl :: write_xlsx (list (...: аргумент x должен быть фреймом данных или списком кадров данных) – JAD 9 November 2017 в 14:08
  • 3
    Как я писал, версия dev. – Giora Simchoni 9 November 2017 в 14:09
  • 4
    @JarkoDubbeldam: я установил шахту из крана, и несколько листов работают для меня (R 3.3.0). Проверьте, являются ли объекты внутри вашего списка data.frames. – Ape 9 November 2017 в 17:33

Размер данных 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 здесь.

3
ответ дан Martijn Pieters 15 August 2018 в 19:01
поделиться

Я не знаком с пакетом 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)

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

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

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

enter image description here [/g0]

enter image description here [/g1]

enter image description here [/g2]

7
ответ дан nrussell 15 August 2018 в 19:01
поделиться

Для меня 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
0
ответ дан setempler 15 August 2018 в 19:01
поделиться
  • 1
    Этот пакет будет работать, но IMHO я бы постарался избежать зависимости от perl (поскольку я постараюсь избежать зависимости Java с xlsx), поскольку это затрудняет настройку – R Yoda 28 January 2018 в 15:52

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

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

require(openxlsx)
list_of_datasets <- list("Name of DataSheet1" = dataframe1, "Name of Datasheet2" = dataframe2)
write.xlsx(list_of_datasets, file = "writeXLSX2.xlsx")
34
ответ дан Syed 15 August 2018 в 19:01
поделиться
  • 1
    Я использовал эти пакеты, и я думаю, что openxlsx является самым быстрым, как его c ++. XlConnect съест вашу оперативную память. Возможно, вы захотите провести сравнительный анализ между xlsx и openxlsx – Hanjo Jo'burg Odendaal 5 April 2016 в 19:38
  • 2
    Другим преимуществом этого пакета является то, что он заботится о R-нумерации в первой строке. – buhtz 15 August 2016 в 10:00
  • 3
    Спасибо, openxlsx::write.xlsx - это способ пойти ... Я сохранял 11 листов, каждый из которых был размером в 20 000 x 10, выполненный через пару секунд, в то время как xlsx::write.xlsx ошибся после добавления второго листа с java.lang.OutOfMemoryError: Java heap space – Djork 30 March 2017 в 00:59
  • 4
    Мне нужно было добавить параметр append=TRUE в write.xlsx, чтобы он сразу написал несколько листов в один файл Excel – mondano 19 May 2017 в 13:21

Я делаю это таким образом для 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)
}
0
ответ дан makarand kulkarni 15 August 2018 в 19:01
поделиться
  • 1
    loadWorkbook является ключевым для открытия существующих файлов – makarand kulkarni 17 July 2018 в 06:17
  • 2
    Также, если вы хотите написать формулы для excel, тогда существует другая функция с именем writeFormula, кроме того, как только вы напишете формулу, файл нужно обновить или снова открыть, а затем сохранить и затем закрыть в excel. демо здесь [link ( stackoverflow.com/questions/46914303/… ) – makarand kulkarni 18 July 2018 в 11:28
Другие вопросы по тегам:

Похожие вопросы: