Экспорт нескольких таблиц в xlsx в R

Вопрос или проблема

Я пытаюсь экспортировать набор таблиц в excel-таблицу. Однако я использую цикл for для создания различных листов, что означает, что в некоторых случаях не все таблицы существуют. Кто-нибудь знает, как экспортировать так, чтобы когда таблицы существуют, они печатались в excel-таблице одна за другой?

На данный момент это то, что у меня есть для моего кода, однако проблема в том, что если, например, pnt_h, mid_h, lc3_h не существуют, тогда rc3_h печатается на строке 27, что оставляет большое пространство между строкой 1, где печатается res_h. Идеально, чтобы res_h печатался с строки 1, а затем rc3_h печатался на 1 строку ниже res_h, в зависимости от того, сколько строк у res_h (обратите внимание, что res_h будет иметь различное количество строк для каждой итерации цикла).

addWorksheet(OUT, "Summary")

writeData(OUT, sheet = "Summary", x = home_matchups, startCol = 1, startRow = 1)

if(exists("res_h")){ writeData(OUT, sheet = "Summary", x = res_h, startCol = 1, startRow = 1) }
if(exists("pnt_h")){ writeData(OUT, sheet = "Summary", x = pnt_h, startCol = 1, startRow = 5) }
if(exists("mid_h")){ writeData(OUT, sheet = "Summary", x = mid_h, startCol = 1, startRow = 9) }
if(exists("lc3_h")){ writeData(OUT, sheet = "Summary", x = lc3_h, startCol = 1, startRow = 13) }
if(exists("rc3_h")){ writeData(OUT, sheet = "Summary", x = rc3_h, startCol = 1, startRow = 27) }

Обратите внимание, что я упростил этот код, чтобы его было легче читать, так что выше оно не будет казаться, что я использую цикл, но я так и делаю.
Кроме того, поскольку нет гарантии, что “res_h” существует, я не могу сделать следующее, как вторую строку

if(exists("pnt_h")){ writeData(OUT, sheet = "Summary", x = pnt_h, startCol = 1, startRow = nrow(res_h) + 3 ) }

Извините, если что-то из этого неясно

В следующий раз, пожалуйста, предоставьте пример данных.

Вы можете включить в каждый блок кода параметр, называемый start_row, который обновляется, если таблица существует. Затем используйте это для следующего аргумента startRow. Например,

library(openxlsx)

OUT <- createWorkbook()
addWorksheet(OUT, "Summary")

writeData(OUT, sheet = "Summary", x=NULL, startCol = 1, startRow = 1)

set.seed(1)
res_h <- data.frame(matrix(rnorm(20), 4, 5))
mid_h <- data.frame(matrix(rnorm(20), 4, 5))

if(exists("res_h")){ 
  writeData(OUT, sheet = "Summary", x = res_h, startCol = 1, startRow = 1) 
  start_row <- nrow(res_h) + 2
  }

if(exists("pnt_h")){ 
  writeData(OUT, sheet = "Summary", x = pnt_h, startCol = 1, startRow = start_row) 
  start_row <- start_row + nrow(pnt_h) + 2
}

if(exists("mid_h")){ 
  writeData(OUT, sheet = "Summary", x = mid_h, startCol = 1, startRow = start_row) 
  start_row <- start_row + nrow(mid_h) + 2
}

saveWorkbook(OUT, "writeDataExample.xlsx", overwrite = TRUE)

Создаст следующий Excel файл:

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

И все ваши блоки кода могут быть упрощены с использованием итерации и вектора имен таблиц.

tables <- c("res_h", "pnt_h", "mid_h")

start_row <- 1

for(x in tables) {
  if(!is.null(dat <- get0(x))) { 
    writeData(OUT, sheet = "Summary", x = dat, startCol = 1, startRow = start_row) 
    start_row <- nrow(dat) + 2
  }
}

saveWorkbook(OUT, "writeDataExample.xlsx", overwrite = TRUE)

Ответ или решение

Экспорт нескольких таблиц в Excel (формат .xlsx) с помощью языка программирования R — задача, которая может вызвать определенные трудности, особенно если надо учитывать наличие или отсутствие таблиц. Рассмотрим, как создать Excel-файл, где таблицы будут выводиться последовательно, без пробелов, даже если некоторые из них отсутствуют.

Основные шаги

  1. Подготовка необходимых библиотек: Для работы с Excel в R удобнее всего использовать библиотеку openxlsx, которая предоставляет мощные функции для создания и редактирования файлов .xlsx.

  2. Создание рабочей книги и листа: Для начала создадим новую рабочую книгу и добавим в нее лист.

  3. Итерация по таблицам: Мы будем использовать цикл, чтобы пройтись по списку таблиц и экспортировать их, если они существуют.

Пример кода

Ниже представлен код, который реализует описанное выше:

library(openxlsx)

# Создаем новую рабочую книгу
OUT <- createWorkbook()
addWorksheet(OUT, "Summary")

# Инициализация списка таблиц, которые нужно экспортировать
tables <- c("res_h", "pnt_h", "mid_h", "lc3_h", "rc3_h")

# Начальный номер строки
start_row <- 1

# Итерируем по именам таблиц
for(table_name in tables) {
  # Получаем таблицу если она существует
  dat <- get0(table_name, envir = globalenv()) # Извлечение объекта из глобальной среды

  # Проверка на наличие таблицы
  if(!is.null(dat)) {
    # Экспорт данных в Excel
    writeData(OUT, sheet = "Summary", x = dat, startCol = 1, startRow = start_row)

    # Обновление стартовой строки для следующей таблицы
    start_row <- start_row + nrow(dat) + 2 # Увеличиваем на количество строк + 2 для пробела
  }
}

# Сохранение рабочей книги
saveWorkbook(OUT, "exported_tables.xlsx", overwrite = TRUE)

Объяснение кода

  1. Инициализация: Мы создаем новую рабочую книгу и добавляем лист с именем "Summary".

  2. Цикл по таблицам: Используя массив tables, мы проходим по именам каждой таблицы. Функция get0 позволяет безопасно извлекать переменные, не вызывая ошибок, если они отсутствуют.

  3. Проверка существования таблицы: Если таблица существует (не равна NULL), мы экспортируем ее в Excel на текущую позицию start_row.

  4. Обновление start_row: После записи таблицы мы обновляем start_row, добавляя количество строк, которое занимает текущая таблица, плюс дополнительный пробел для отделения от следующей таблицы.

  5. Сохранение файла: В конце мы сохраняем результирующую рабочую книгу в файл exported_tables.xlsx.

Заключение

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

Оцените материал
Добавить комментарий

Капча загружается...