2015-07-09 2 views
8

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

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

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, что ограничивает мне только пурпурные и белые. Как я могу добавить другое условие здесь?

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

Это тот же пример, что и the accepted answer to this question. Спасибо!

+0

Заканчивать пакет форматтера, https://cran.r-project.org/web/packages/f ormattable/vignettes/formattable-data-frame.html. Я получил свои требования к форматированию таблиц, полностью покрытые этим (по-сотовому форматированию), используя только этот пакет, который вызывает функцию knitr :: kable. – Nova

ответ

7

Рассматривали ли вы 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

+0

Вау! Это так же просто, как и получается, спасибо! Если мне известны номера строк в каждом столбце, которые я хочу изменить, как бы это указать? Например, в столбце «результат», скажем, строки 1, 2, 4, я хочу быть синим, а строки 3, 5, 6 - пурпурный. Если бы аргумент 'formatstyle' был чем-то вроде' background = styleEqual (c (1,2, 4, 3, 5, 6), c (rep («lightblue», 3), rep («пурпурный», 3)) «Конечно, я бы не стал эксплицировать номера строк. У меня был бы вектор« синий », чтобы сохранить номера строк для синего, а вектор« пурпурный »хранит номера строк для пурпурного. – gbrlrz017

+0

Проверьте документацию: http : //rstudio.github.io/DT/functions.html. – lukeA

+0

Мне удалось легче выделить на основе значения в ячейке вместо номера строки, как и для столбца «результат». Еще раз спасибо вы, эта таблица красива! – gbrlrz017

3

Для добавления дополнительных цветов вам потребуется больше условий, например. если вы хотите иметь различный цвет в 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

+0

Спасибо! Что такое рабочий пример, чтобы указать комбинацию rgroup и cgroup, в которой я нуждаюсь? Я полагаю, у ссылки, которую вы дали, не было четкого примера выбора отдельных ячеек. – gbrlrz017

+0

Извините, вам, возможно, придется прочитать документацию и попробовать некоторые вещи. –

4

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

Эта функция встроена в htmlTable через css.cell аргумент:

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

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


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

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

Таким образом, самый простой способ, как я полагал, (hackily) вставить некоторые 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

Смежные вопросы