Вопрос или проблема
Я пытаюсь экспортировать набор таблиц в 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-файл, где таблицы будут выводиться последовательно, без пробелов, даже если некоторые из них отсутствуют.
Основные шаги
-
Подготовка необходимых библиотек: Для работы с Excel в R удобнее всего использовать библиотеку
openxlsx
, которая предоставляет мощные функции для создания и редактирования файлов .xlsx. -
Создание рабочей книги и листа: Для начала создадим новую рабочую книгу и добавим в нее лист.
-
Итерация по таблицам: Мы будем использовать цикл, чтобы пройтись по списку таблиц и экспортировать их, если они существуют.
Пример кода
Ниже представлен код, который реализует описанное выше:
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)
Объяснение кода
-
Инициализация: Мы создаем новую рабочую книгу и добавляем лист с именем "Summary".
-
Цикл по таблицам: Используя массив
tables
, мы проходим по именам каждой таблицы. Функцияget0
позволяет безопасно извлекать переменные, не вызывая ошибок, если они отсутствуют. -
Проверка существования таблицы: Если таблица существует (не равна
NULL
), мы экспортируем ее в Excel на текущую позициюstart_row
. -
Обновление
start_row
: После записи таблицы мы обновляемstart_row
, добавляя количество строк, которое занимает текущая таблица, плюс дополнительный пробел для отделения от следующей таблицы. -
Сохранение файла: В конце мы сохраняем результирующую рабочую книгу в файл
exported_tables.xlsx
.
Заключение
Данный подход позволяет динамически управлять экспортом таблиц в файл Excel, избегая проблем с пустыми строками между записями. Важно помнить, что структура ваших данных может варьироваться, и, соответственно, необходимо корректировать код при изменении состава таблиц. Этот метод обеспечивает чистый и организованный вывод всех доступных таблиц в Excel.