Отображать фрейм данных в виде таблицы HTML с условным окрашиванием на основе другого столбца - PullRequest
2 голосов
/ 24 июня 2019

У меня есть датафрейм (mtcars). В нем есть столбцы с именами: mpg cyl disp hp drat wt qsec vs Я хочу сравнить каждый столбец с vs (столбец 1 против столбца 8, столбец 2 против столбца 8 и т. Д.) И покрасить каждый столбец с 1: 7 как красный (если элемент меньше, чем один в столбце 8), желтый (если равно) или зеленое (если больше).

Я использовал пакет KableExtra и использовал следующий код:

library(dplyr)
library(kableExtra)
mtcars %>%
 mutate(
   car = row.names(.),
   mpg = cell_spec(mpg, "html", background = ifelse(mpg > vs, "green", "red")),
   cyl = cell_spec(cyl, "html", background = ifelse(cyl > vs,"green", "red" )),
 ) %>%
 kable(format = "html", escape = F) %>%
 kable_styling("striped", full_width = F)

Я мог бы как-то достичь, но у меня есть две главные проблемы:

  1. KableExtra не создает фон ячейки в виде плитки / заливки в Html, он просто выделяет текст в ячейке. Я вижу, что латекс может производить клеточный фон, но я не могу использовать латекс, нужно только html решение.

  2. В моем фактическом фрейме данных есть 70 динамических столбцов, поэтому необходимо обращаться к столбцам без имен.

Пробовал также с condformat и tableHTML ... но не смог добиться динамического сравнения столбцов.

1 Ответ

1 голос
/ 25 июня 2019

Возможный способ использования стиля столбцов в пакете DT - добавление набора фиктивных столбцов, используемых для установки цветов фона в formatStyle:

library(dplyr)
library(DT)

## add dummy columns for formatting
mtcarsColor <- mutate_all(mtcars, list(color = ~case_when(
            . < mtcars$vs ~ -1,
            . > mtcars$vs ~  1,
            TRUE ~ 0
        )
    )
)

## relevant column indices
dataCols <- grep("color", names(mtcarsColor), invert = TRUE) 
colorCols <- grep("color", names(mtcarsColor))

## datatable formatted by (hidden) dummy columns
datatable(mtcarsColor,
        rownames = FALSE,
        options = list(columnDefs = list(list(visible = FALSE, targets = colorCols - 1)))    
    ) %>%
    formatStyle(columns = dataCols,
        valueColumns = colorCols,
        backgroundColor = styleEqual(c("-1", "0", "1"), c("#FF000080", "#FFFF0080", "#00FF0080"))
    )

DT with background colors

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...