KableExtra有条件地格式化列上的特定行

时间:2018-06-03 11:08:15

标签: r kable kableextra

我刚刚学习了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时,这些第二行和第三行应为“红色”,等于1时应为黄色,低于1时为绿色。

有人可以帮助我吗?

2 个答案:

答案 0 :(得分:3)

这是一个根据值忽略第一行和最后一行和颜色的示例,就像你说的那样,但忽略了字母。

首先,我加载库。

# 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()

答案 1 :(得分:0)

对于数据框而言,这不是一个好设计:列必须是所有类型,因此您的数字将被强制转换为字符。

尽管如此,你可以按照以下要求做。

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)