代码之家  ›  专栏  ›  技术社区  ›  doctshind s

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

  •  2
  • doctshind s  · 技术社区  · 8 年前

    我刚刚学习了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 回复  |  直到 8 年前
        1
  •  3
  •   Dan    8 年前

    这里有一个例子,它忽略了第一行和最后一行以及根据值的颜色,就像你说的,但是忽略了字母。

    首先,我加载库。

    # 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()
    
        2
  •  0
  •   user2554330    8 年前

    对于dataframe来说,这不是一个好的设计:列必须都是一种类型,因此您的数字将强制为字符。

    不过,你可以按以下要求做。

    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)