将数据框显示为HTML表,并基于另一列进行条件着色

时间:2019-06-24 17:38:22

标签: r

我有一个数据框(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 个答案:

答案 0 :(得分:1)

在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