Как сохранить фрейм данных R в файл Excel с определенными ячейками, выделенными жирным шрифтом?
Я часто пишу статьи с корреляционными матрицами. Я хотел бы иметь возможность экспортировать матрицу корреляции в Excel в формате xls или xlsx. Я также хотел бы отформатировать жирным шрифтом корреляции, которые соответствуют порогу (например, > .2). Я думал, может быть, XLConnect может обеспечить функциональность.
Чтобы упростить пример, предположим, что кадр данных выглядит следующим образом, и предположим, что я хочу выделить все ячейки больше 5.
x <- data.frame(matrix(1:9, nrow = 3))
# > x
# X1 X2 X3
# 1 1 4 7
# 2 2 5 8
# 3 3 6 9
Кроме того, я отмечаю, что были предложены решения для скрепления ячеек для уценки:
- Как выделить ячейку в таблице (kable) в rmarkdown?
- Форматирование жирным шрифтом для значимых значений в таблице Rmarkdown
Я также нашел этот ответ, но это не очень общее решение в том смысле, что для его адаптации к общей задаче получения фрейма данных и правила форматирования требуется немало:
экспортировать фреймы данных в Excel через xlsx с условным форматированием
1 ответ
Я создал следующую функцию, которая была адаптирована из ответа @ Jota здесь
xlsx_boldcells <- function(x, matches, file = "test.xlsx", sheetname = "sheet1") {
# x data.frame or matrix
# matches: logical data.frame or matrix of the same size indicating which cells to bold
# copy data frame to work book and load workbook
require(xlsx)
write.xlsx(x, file, sheetName=sheetname)
wb <- loadWorkbook(file)
# specify conditional formatting
# Note: this could be modified to apply different formatting
# see ?CellStyle
fo <- Font(wb, isBold = TRUE)
cs <- CellStyle(wb, font=fo)
# Get cell references
sheets <- getSheets(wb) # get all sheets
sheet <- sheets[[sheetname]] # get specific sheet
rows <- getRows(sheet, rowIndex=2:(nrow(x)+1)) # get rows
cells <- getCells(rows, colIndex = 2:(ncol(x)+1))
# Matches to indexes
indm <- data.frame(which(matches, arr.ind = TRUE, useNames = FALSE))
names(indm) <- c("row", "col")
# +1 required because row and column names occupy first rows and columns
indm$index <- paste(indm$row + 1, indm$col + 1, sep = ".")
# apply cell style
lapply(indm$index, function(ii) setCellStyle(cells[[ii]],cs))
# save workbook
saveWorkbook(wb, file)
}
Таким образом, это может быть применено к предложенной проблеме:
xlsx_boldcells(x, x > 5)
получая:
Или это может быть применено к общей проблеме корреляции (то есть выделение больших корреляций, например, больше чем 0,6) следующим образом:
data(mtcars)
cors <- round(cor(mtcars), 2)
xlsx_boldcells(cors, abs(cors) > .6 & cors!=1, file = "cormatrix.xlsx")