根据另一列中的值,用颜色有条件地填充特定列中的单元格 [英] Conditionally fill cells in specific columns with colour based on value in another column

查看:43
本文介绍了根据另一列中的值,用颜色有条件地填充特定列中的单元格的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有以下数据框:

col1 <- rep(c("A","B","C","D"),10)
col2 <- rep(c(1,0),10)
col3 <- rep(c(0,1),10)
col4 <- rep(c(1,0),10)
col5 <- rep(c(0,1),10)

test_df <- data.frame(col1, col2, col3, col4, col5, stringsAsFactors = F)

我想根据col1中的值为多列中的特定行单元着色,并在表中的两列之间(基于col1中的相同值)添加一条垂直线(指示限制)

I would like to color specific row cells across multiple columns based on the values in col1, and also add a vertical line (indicating a limit) between two columns in the table (based on the same value in col1)

例如,如果col1 =="A",那么我想为col2和col5中的单元格涂上灰色,与col1 == A在同一行.

For example, if col1 == "A", then i want to color the cells in col2 and col5 grey, in the same row as col1 == A.

使用伪代码:

if col1 == A: color columns(col2, col5), vert.line between col3 and col4
if col1 == B: color columns(col2, col3, col5), vert.line between col4 and col5
if col1 == C: color columns(col2, col4, col5), vert.line between col3 and col4
if col1 == D: color columns(col2, col5), vert.line between col2 and col3

我想指定这些规则,以便在必要时可以轻松地对其进行更改.

I would like to specify these rules so they can easily be changed if necessary.

我想结束这样的事情(星号表示单元格颜色):

I want to end up with something like this (asterisks indicate cell coloring):

col1   col2   col3   col4   col5
A      *1*     0   | 1      *0*
B      *0*    *1*    0    | *1*
C      *1*    *0*  | 1      *0*
D      *0*  |  1     0      *1*
A      *1*     0   | 1      *0*
B      *0*    *1*    0    | *1*
C      *1*    *0*  | 1      *0*
D      *0*  |  1     0      *1*

我将其显示在一个闪亮的应用程序和降价文档的表格中.有什么办法用f做到这一点.是xtable还是dplyr?

I am presenting this in a table in a shiny app and markdown document. Is there any way to do this with f. ex xtable or dplyr?

推荐答案

有一种解决方案,结合使用 tableHTML 和2个函数来复制逻辑.

There is a solution using tableHTML in combination with 2 functions to replicate the logic.

首先,您需要为每列创建css,以提供应应用于表的样式信息.我将其分为2个功能,一个用于背景,一个用于列之间的行.

First, you need to create css for each column that provides the styling information that should be applied to the table. I have split it into 2 functions, one for the background, and one for the line between columns.

library(tableHTML)

第一个函数根据 col1 中的值更改单元格的颜色.您可以通过在函数的参数中提供不同的颜色来更改它们.

The first function changes the colour of cells based on the value in col1. You can change them by providing different colours in the arguments of the function.

get_background_column_css <- function(col1,
                                   a_col = "lightgray",
                                   b_col = "steelblue",
                                   c_col = "lightgreen",
                                   d_col = "indianred",
                                   default = "white") {
  # create css for col2
  background_color_col2 <- ifelse(col1 == "A", a_col, 
                      ifelse(col1 == "B", b_col,
                      ifelse(col1 == "C", c_col,
                      ifelse(col1 == "D", d_col, default
                             ))))
  css_col2 <- setNames(list(list(c("background-color"),
                     list(background_color_col2))), "col2")

  # create css for col3
  background_color_col3 <- ifelse(col1 == "B", b_col,
                                  ifelse(col1 == "C", c_col, default))
  css_col3 <- setNames(list(list(c("background-color"),
                                 list(background_color_col3))), "col3")
  # create css for col4
  background_color_col4 <- rep("", length(col1))
  css_col4 <- setNames(list(list(c("background-color"),
                                 list(background_color_col4))), "col4")
  # create css for col5
  background_color_col5 <- ifelse(col1 == "A", a_col, 
                                  ifelse(col1 == "B", b_col,
                                         ifelse(col1 == "C", c_col,
                                                ifelse(col1 == "D", d_col, default
                                                ))))
  css_col5 <- setNames(list(list(c("background-color"),
                                 list(background_color_col5))), "col5")

  list(css_col2, css_col3, css_col4, css_col5)
}

第二个函数在列之间添加边框.

The second function adds a border between columns.

get_border_column_css <- function(col1) {
  # create css for col2
  border_col2 <- ifelse(col1 == "D", "1px solid black", "0px")
  css_col2 <- setNames(list(list(c("border-right"),
                                 list(border_col2))), "col2")
  # create css for col3
  border_col3 <- ifelse(col1 == "C", "1px solid black", "0px")
  css_col3 <- setNames(list(list(c("border-right"),
                                 list(border_col3))), "col3")
  # create css for col4
  border_col4 <- ifelse(col1 == "B", "1px solid black", "0px")
  css_col4 <- setNames(list(list(c("border-right"),
                                 list(border_col4))), "col4")
  # create css for col5
  border_col5 <- rep("0px", length(col1))
  css_col5 <- setNames(list(list(c("border-right"),
                                 list(border_col5))), "col5")

  list(css_col2, css_col3, css_col4, css_col5)
}

为了测试功能,我仅使用前4行(因为它们具有所有可能的组合):

In order to test the function, I only use the first 4 rows (since they have all the combinations of possibilities):

test_df <- head(test_df, 4)

接下来,我为 background-color 创建1个CSS列表,为 border 创建1个CSS列表,这些列表可以提供给 add_css_conditional_column()

Next, I create 1 css list for the background-color and 1 css list for the border that can be supplied to add_css_conditional_column()

css_background = get_background_column_css(test_df$col1)
css_border = get_border_column_css(test_df$col1)

接下来,我创建一个 tableHTML 对象.

Next, I create a tableHTML object.

tableHTML <- tableHTML(test_df,
                       rownames = FALSE,
                       border = 0) 

接下来,我将循环中的背景CSS添加到每一列:

Next, I add the background css in a loop to each column:

for (i in 1:4) {
  tableHTML <- tableHTML %>%
    add_css_conditional_column(conditional = "colour_rank",
                               colour_rank_css = css_background[[i]],
                               columns = names(test_df)[i + 1])
}

和边框CSS:

for (i in 1:4) {
  tableHTML <- tableHTML %>%
    add_css_conditional_column(conditional = "colour_rank",
                               colour_rank_css = css_border[[i]],
                               columns = names(test_df)[i + 1])
}

这是结果:

tableHTML

这篇关于根据另一列中的值,用颜色有条件地填充特定列中的单元格的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆