KableExtra 有条件地格式化列上的特定行
KableExtra conditionally formatting specific rows on a column
我刚刚学习了 KableExtra 并知道如何使用 mutate() 有条件地格式化整个列,如使用 mutate 的文档中所述:
mutate(
mpg = cell_spec(mpg, background = ifelse(mpg > 20, "red", "blue"))
)
但我不知道的是,如何在显示所有行的同时仅更改每列中某些行的背景颜色。
比如我的数据:
df <- data.frame( region1 = c("A", sample(1:5,3)),
region2 = c("B", sample(1:5,3)),
region3 = c("C", sample(1:5,3)),
region4 = c("A", sample(1:5,3)) )
现在我只想格式化第二行和第三行。我不想更改第一行和最后一行的颜色背景。这些第二行和第三行在高于 1 时应为 'red',等于 1 时应为黄色,低于 1 时应为绿色。
有人可以帮我吗?
这对于数据框来说不是一个好的设计:列必须都是一种类型,因此您的数字将被强制转换为字符。
尽管如此,您可以按照以下要求进行操作。
fixcol <- function(col) {
x <- as.numeric(col[2:3])
x <- cell_spec(x, background = ifelse(x > 1, "red", ifelse(x == 1, "yellow", "green")))
col[2:3] <- x
col
}
df <- as.data.frame(lapply(df, fixcol))
kable(df, escape = FALSE)
这是一个根据值忽略第一行和最后一行和颜色的示例,如您所说,但忽略字母。
首先,我加载库。
# Load libraries
library(knitr)
library(kableExtra)
接下来,我创建一个虚拟数据框。
# Create data frame
df <- data.frame( region1 = c(sample(c(-5:5, letters[1:5]), 10, replace = TRUE)),
region2 = c(sample(c(-5:5, letters[1:5]), 10, replace = TRUE)),
region3 = c(sample(c(-5:5, letters[1:5]), 10, replace = TRUE)),
region4 = c(sample(c(-5:5, letters[1:5]), 10, replace = TRUE)), stringsAsFactors = FALSE )
在这里,我定义了格式化单元格的函数。我忽略第一行和最后一行并检查字符是字母还是数字,然后相应地着色。
foo <- function(x, n, nmax){
cell_spec(x, background = ifelse(is.na(as.numeric(x)), "white",
ifelse(n == nmax | n == 1, "white",
ifelse(x > 1, "red",
ifelse(x < 1, "green", "yellow")))))
}
最后,我应用了函数。
df %>%
mutate_all(funs(foo(., n = row_number(), nmax = n()))) %>%
kable(escape = FALSE) %>%
kable_styling()
我刚刚学习了 KableExtra 并知道如何使用 mutate() 有条件地格式化整个列,如使用 mutate 的文档中所述:
mutate(
mpg = cell_spec(mpg, background = ifelse(mpg > 20, "red", "blue"))
)
但我不知道的是,如何在显示所有行的同时仅更改每列中某些行的背景颜色。
比如我的数据:
df <- data.frame( region1 = c("A", sample(1:5,3)),
region2 = c("B", sample(1:5,3)),
region3 = c("C", sample(1:5,3)),
region4 = c("A", sample(1:5,3)) )
现在我只想格式化第二行和第三行。我不想更改第一行和最后一行的颜色背景。这些第二行和第三行在高于 1 时应为 'red',等于 1 时应为黄色,低于 1 时应为绿色。
有人可以帮我吗?
这对于数据框来说不是一个好的设计:列必须都是一种类型,因此您的数字将被强制转换为字符。
尽管如此,您可以按照以下要求进行操作。
fixcol <- function(col) {
x <- as.numeric(col[2:3])
x <- cell_spec(x, background = ifelse(x > 1, "red", ifelse(x == 1, "yellow", "green")))
col[2:3] <- x
col
}
df <- as.data.frame(lapply(df, fixcol))
kable(df, escape = FALSE)
这是一个根据值忽略第一行和最后一行和颜色的示例,如您所说,但忽略字母。
首先,我加载库。
# Load libraries
library(knitr)
library(kableExtra)
接下来,我创建一个虚拟数据框。
# Create data frame
df <- data.frame( region1 = c(sample(c(-5:5, letters[1:5]), 10, replace = TRUE)),
region2 = c(sample(c(-5:5, letters[1:5]), 10, replace = TRUE)),
region3 = c(sample(c(-5:5, letters[1:5]), 10, replace = TRUE)),
region4 = c(sample(c(-5:5, letters[1:5]), 10, replace = TRUE)), stringsAsFactors = FALSE )
在这里,我定义了格式化单元格的函数。我忽略第一行和最后一行并检查字符是字母还是数字,然后相应地着色。
foo <- function(x, n, nmax){
cell_spec(x, background = ifelse(is.na(as.numeric(x)), "white",
ifelse(n == nmax | n == 1, "white",
ifelse(x > 1, "red",
ifelse(x < 1, "green", "yellow")))))
}
最后,我应用了函数。
df %>%
mutate_all(funs(foo(., n = row_number(), nmax = n()))) %>%
kable(escape = FALSE) %>%
kable_styling()