openxlsx
функции для записи формулы, кажется, добавляют формулу только по столбцам.
Есть ли эффективный способ записи формулы по строкам?
Проиллюстрируем проблему на воспроизводимом примере:
df <- data.frame(a = 1:3,
b = 4:6,
c = 7:9)
# create workbook, worksheet and write data to worksheet
wb <- createWorkbook()
addWorksheet(wb, "Sheet 1")
writeData(wb, "Sheet 1", x = df)
# formula to be added rowwise to cells A5:C5
f <- c("SUM(A2:A4)", "SUM(B2:B4)", "SUM(C2:C4)")
# Using the openxlsx function results in columnwise addition of the formula vector:
writeFormula(wb, sheet = 1, x = f, startCol = 1, startRow = 5)
saveWorkbook(wb, "rowwise_writeFormula.xlsx", overwrite = TRUE)
Это приводит к:
writeFormula
по строкам
Наивный подход состоит в том, чтобы добавлять каждую формулу по отдельности, что, возможно, подходит для небольших наборов данных.
writeFormula(wb, sheet = 1, x = "SUM(A2:A4)", startCol = 1, startRow = 5)
writeFormula(wb, sheet = 1, x = "SUM(B2:B4)", startCol = 2, startRow = 5)
writeFormula(wb, sheet = 1, x = "SUM(B2:B4)", startCol = 3, startRow = 5)
Это дает то, что я хочу, но не подходит для сотен столбцов.
Используя purrr :: pwalk, это можно заключить в функцию, что является улучшением:
formula_inputs <- list(formula = f,
start_col = 1:3,
start_row = rep(5, 3))
purrr::pwalk(formula_inputs, function(formula, start_col, start_row) writeFormula(wb, sheet = 1, x = formula, startCol = start_col, startRow = start_row))
В любом случае это делает то, что требуется:
Мой вопрос: есть ли способ лучше? или это может быть улучшение openxlsx?
В моем реальном случае у меня есть 100 переменных для 10 фреймов данных в списке, каждая из которых требует нескольких (10) построчных формул для построения общей суммы. Всего нужно написать около 10 000 формул, это займет несколько минут; так что любые идеи о том, как ускорить процесс, будут приветствоваться.
Примечание: альтернативный подход openxlsx с использованием writeData для векторов класса «formula» также добавляет векторы как столбцы; когда я пытаюсь переставить векторы в строки, класс формулы теряется.
f <- colSums(df)
, затемrbind f
вdf
, а затем экспортировать в книгу? - person SteveM   schedule 15.08.2020apply
family илиpurrr
в соответствии с вашим подходом, описанным выше. Есть еще одно сообщение об этом здесь - person MKa   schedule 17.08.2020apply
может быть быстрее, чемpurrr
- person Peter   schedule 17.08.2020