Как раскрасить определенные ячейки в фрейме данных / таблице в 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")))
мой ответ ниже действительно тупой.. Вот правильный путь:
эта функция встроена в 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)
трудно сказать, если вы не меняетесь взад и вперед, но интервал в этой таблице и аналогичный ниже немного отличается. 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)))
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;')))
для добавления дополнительных цветов, необходимо несколько условий, например, если вы хотите иметь другой цвет для 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