根据另一列中的值,用颜色有条件地填充特定列中的单元格 [英] Conditionally fill cells in specific columns with colour based on value in another column
问题描述
我有以下数据框:
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屋!