Как раскрасить определенные ячейки в фрейме данных / таблице в R?

Я хотел бы покрасить определенные ячейки в следующем фрейме данных. Например, в столбце inputval я хотел бы выделить ячейки в диапазоне [0.8, 0.9) маджента и ячейки в том же столбце в диапазоне [0.7, 0.8) синий. Аналогично, я бы хотел, чтобы ячейки выходного столбца со значением 1 были окрашены в пурпурный цвет, а ячейки со значением 4-в синий. Для остальных ячеек в таблице данных, я хотел бы, чтобы они остались белыми.

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

set.seed(123)
df <- data.frame(id       = sample(1:100, 20, replace = TRUE),
                 inputval = sample(seq(0, 1, by=0.01), 20, replace = TRUE),
                 outcome  = sample(1:4, 20, replace = TRUE))

cols <- with(df, ifelse(outcome == 1, 'magenta', 'white'))

library('htmlTable')
htmlTable(as.matrix(df), col.rgroup = cols)

Я понимаю, что проблема добавления разных цветов связана с ifelse вызов в with это ограничивает меня только пурпурным и белым. Как я могу добавить еще одно условие?

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

Это тот же пример, что и принятый ответ на этот вопрос. Спасибо!

3 ответов


вы рассматривали DT?

library(DT)
datatable(df, rownames = FALSE) %>%
  formatStyle(columns = "inputval", 
              background = styleInterval(c(0.7, 0.8, 0.9)-1e-6, c("white", "lightblue", "magenta", "white"))) %>%
  formatStyle(columns = "outcome", 
              background = styleEqual(c(1, 4), c("magenta", "lightblue"))) 

enter image description here


мой ответ ниже действительно тупой.. Вот правильный путь:

эта функция встроена в htmlTable через :

на css.cell элемент позволяет добавить любой возможный стиль CSS в ячейки таблицы. Если вы предоставляете вектор вектору, предполагается, что стили должны повторяться по всем столбцам. Если вы предоставляете матрицу того же размера, что и ваш аргумент x. Если есть ncol(x) + 1 первая строка будет соответствовать rowname стиль. Соответственно, если размер nrow(x) + 1 предполагается, что первая строка является строкой заголовка.

поэтому в основном вам просто нужно определить матрицу стилей для каждой ячейки:

x <- head(cars)

## indices defining where the styles go
where <- rbind(c(2,2), c(2,1), c(5,2))
style <- c('background-color: red; color: white;',
           'border: solid 1px;',
           'font-weight: 900; color: blue;')

css.cell <- matrix('', nrow(x), ncol(x))
css.cell[where] <- style

#      [,1]                 [,2]                                  
# [1,] ""                   ""                                    
# [2,] "border: solid 1px;" "background-color: red; color: white;"
# [3,] ""                   ""                                    
# [4,] ""                   ""                                    
# [5,] ""                   "font-weight: 900; color: blue;"      
# [6,] ""                   ""                                

htmlTable(head(cars), css.cell = css.cell)

enter image description here

трудно сказать, если вы не меняетесь взад и вперед, но интервал в этой таблице и аналогичный ниже немного отличается. The inject_div пример выглядит немного более сосредоточенным.


A немного поздно, но @CyrusMohammadian сделал комментарий к моему другому ответу, и поскольку комментарий/вопрос такой же, как этот, я добавлю ответ здесь, а не отредактирую свой ответ, который был для (немного) другого вопроса.

таблицы могут стать сложными, и у каждого есть разные функции, которые они хотят. Я не думаю, что это возможно для Макс иметь встроенные решения для всех.

поэтому самый простой способ, который я думаю, будет (хакили) вводить некоторые html / css в вашу таблицу (вы, вероятно, также можете сделать это после запуска htmlTable, то есть непосредственно в html-коде, но это проще, я думаю):

#' Inject div
#' 
#' Inject an html division tag with style attribute.
#' 
#' @param x a matrix or data frame
#' @param where an \code{nx2} matrix of row and column indices or vector (of
#' the form c(row, col, row, col, ...)) specifying which cells to select
#' @param style vector of character string(s) applied to each cell, recycled
#' if necessary

inject_div <- function(x, where, style = 'background-color: lightgrey; border: solid 1px') {
  if (!all(sapply(style, nzchar)))
    return(x)
  where <- matrix(where, ncol = 2L, byrow = !is.matrix(where))
  style <- rep_len(style, nrow(where))
  if (length(where) > 0)
    x[where] <- sprintf('<div style=\'%s\'>%s</div>',
                      gsub(';*$', ';', style), x[where])
  x
}

library('htmlTable')
htmlTable(inject_div(head(cars), cbind(2,2)))

enter image description here

htmlTable(inject_div(head(cars), where = c(2,2,2,1,5,2),
                     ## equivalently
                     # where = rbind(c(2,2), c(2,1), c(5,2))
                     style = c('background-color: red; color: white;',
                               'border: solid 1px;',
                               'font-weight: 900; color: blue;')))

enter image description here


для добавления дополнительных цветов, необходимо несколько условий, например, если вы хотите иметь другой цвет для outcome из 1 и определенного inputval:

cols <- with(df, ifelse(outcome == 1,
                        ifelse(inputval == 5, 'magenta', 'red'),
                        'white')

так что это должно покрасить что-нибудь с outcome == 0 как белый, а если outcome == 1 и inputval == 5, это будет пурпурный; остальные будут красными.

для вашего другого вопроса Вы можете использовать комбинацию rgroup и cgroup чтобы указать, какие строки / столбцы вы хотите покрасить, см. виньетку или см. здесь: http://cran.r-project.org/web/packages/htmlTable/vignettes/tables.html