Как сохранить фрейм данных R в файл Excel с определенными ячейками, выделенными жирным шрифтом?

Я часто пишу статьи с корреляционными матрицами. Я хотел бы иметь возможность экспортировать матрицу корреляции в Excel в формате xls или xlsx. Я также хотел бы выделить жирным шрифтом корреляции, соответствующие порогу (например,> 0,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

В стороне отмечу, что были предложены решения для выделения ячеек для уценки:

Я также нашел этот ответ, но это не очень общее решение, поскольку требуется совсем немного, чтобы адаптировать его к общей задаче получения фрейма данных и правила форматирования:

экспорт фреймов данных в Excel через xlsx с условным форматированием


person Jeromy Anglim    schedule 01.08.2016    source источник
comment
Пожалуйста, покажите все попытки, которые вы предприняли. Я почти не работаю с электронными таблицами, и я решил эту проблему много лет назад. В пакете xlsx есть (были?) примеры, делающие именно это .   -  person Dirk Eddelbuettel    schedule 01.08.2016
comment
@DirkEddelbuettel Я еще не начал. Но если я найду решение, я опубликую ответ, как я это часто делаю. Мое исходное предположение заключалось в том, что нет простого ответа, когда вы гуглите вопрос, и это распространенный вариант использования, поэтому было бы хорошо, если бы такой ресурс существовал.   -  person Jeromy Anglim    schedule 01.08.2016
comment
Ресурс существует и задокументирован в пакете xlsx. Предлагаю закрыть этот вопрос. Это только добавляет шум и нулевой сигнал.   -  person Dirk Eddelbuettel    schedule 01.08.2016
comment
@DirkEddelbuettel Я не согласен. Цель StackOverflow — создавать ресурсы в Интернете, которые ускоряют процесс кодирования. Если вы гуглите четкий вопрос, а ответ не всплывает, то ресурс не такой уж и доступный. Если решение задокументировано, процитируйте решение. Я ценю совет по xlsx, но перейти от этой документации к решению непросто. Существует также множество пакетов Excel для R. Так что добавьте еще один барьер между вариантом использования и решением. Я проработаю это и опубликую ответ   -  person Jeromy Anglim    schedule 01.08.2016
comment
Пожалуйста, объясните, как добавление десятков (сотней, тысяч, ...) сообщений без содержания облегчает поиск. Ты. Являются. Изготовление. Это. Хуже. Конец нити для меня, здесь нет никакой выгоды, поскольку вы наверняка убеждены в своем веселом пути. Давайте согласимся не согласиться здесь.   -  person Dirk Eddelbuettel    schedule 01.08.2016
comment
rdocumentation.org/packages/xlsx/versions/0.5.7/ темы/   -  person Dirk Eddelbuettel    schedule 01.08.2016
comment
@dirk Спасибо, похоже, это хорошая отправная точка.   -  person Jeromy Anglim    schedule 01.08.2016
comment
Вы можете адаптировать связанный ответ вот так, нет? sheetname <- "mysheet"; write.xlsx(x, "mydata.xlsx", sheetName=sheetname); file <- "mydata.xlsx"; wb <- loadWorkbook(file); cs <- CellStyle(wb) + Font(wb, isBold = TRUE); sheets <- getSheets(wb); sheet <- sheets[[sheetname]]; rows <- getRows(sheet, rowIndex=2L:(nrow(x) + 1L)); cells <- getCells(rows, colIndex = 2L:(ncol(x) + 1L)); lapply(which(t(x) > 5), function(ii) setCellStyle(cells[[ii]], cs)); saveWorkbook(wb, file). Я уверен, что вы можете сделать это без создания .xlsx, чтения его в R, применения форматирования и повторного сохранения.   -  person Jota    schedule 01.08.2016
comment
@jota Спасибо, я адаптировал ваш ответ. Надеюсь, ты не против. Огромное спасибо.   -  person Jeromy Anglim    schedule 01.08.2016


Ответы (1)


Я создал следующую функцию, адаптированную из @jota answer here

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)

уступая:

 лист excel с полужирным шрифтом

Или его можно применить к общей проблеме корреляции (т. Е. Выделение жирным шрифтом больших корреляций, например, больше 0,6) следующим образом:

data(mtcars)
cors <- round(cor(mtcars), 2)
xlsx_boldcells(cors, abs(cors) > .6 & cors!=1, file = "cormatrix.xlsx")

Корреляции в ячейках, выделенные полужирным шрифтом, с использованием xlsx

person Jeromy Anglim    schedule 01.08.2016