首页 > 解决方案 > 使用条件语句(case_when)跨多个列更改 kableExtra 中的单元格颜色

问题描述

我有一个包含多个character变量(名为 First、Second 等)的表。这些变量中的每一个都包含许多可能的字符串(例如“DBP”、“Low PA”)。我想为这些字符串中的每一个分配背景颜色(例如“DBP”或“SBP = red,“Low PA” = blue)。

我希望能够这是一个语句,而不是为每一列mutate编写单独的语句:case_when

    ```{r table1,}
df1 = data.frame(year = c(2014, 2015, 2011, 2013),
                 outcome = c("decline", "death", "death or decline", "decline"),
                 "First" = c("DBP", "Cholesterol", "Low PA", "CRP"),
                 "Second" =  c("SBP", "CRP",NA ,NA ),
                  "Third" = c("Low PA", "SBP", NA, NA))
df1 = data.frame(lapply(df1, as.character), stringsAsFactors=FALSE)
df1[is.na(df1)] = ""
df1%>%
  kbl("latex", longtable = TRUE, escape = F, booktabs =  T)%>%
  mutate(across(c(3:5)), column_spec (., background = case_when(. == "SBP" ~ "red",
                                                                    . == "Low PA" ~ "blue",
                                                                    . =="CRP" ~ "gray",
                                                                    TRUE ~ "white")) )%>%
  kable_styling(latex_options= c( "repeat_header"), font_size =10,repeat_header_method =  "replace")

这是我尝试过的一个例子。为此,我得到错误:UseMethod(“mutate”)中的错误:没有适用于“mutate”的方法应用于“knitr_kable”类的对象。

以下代码适用于一列(“第一”)

df1%>%
  kbl("latex", longtable = TRUE, escape = F, booktabs =  T)%>%
  column_spec(3 , background = case_when(df1$First == "DBP" ~ "red",
                                                df1$First == "SBP" ~ "red",
                                                df1$First == "Low PA" ~ "blue",
                                                df1$First =="CRP" ~ "gray",
                                                TRUE ~ "white"))%>%
  kable_styling(latex_options= c( "repeat_header"), font_size =10, repeat_header_method =  "replace")

标签: rdplyrkableextra

解决方案


实现所需结果的一种选择是使用purrr::reduce(或Reduce从基础 R),如下所示:

df1 %>%
  kbl("latex", longtable = TRUE, escape = F, booktabs = T) %>%
  purrr::reduce(3:5, function(x, y) {
    col <- df1[, y]
    column_spec(x, y, background = case_when(
      col == "SBP" ~ "red",
      col == "Low PA" ~ "blue",
      col == "CRP" ~ "gray",
      TRUE ~ "white"))
  }, .init = .) %>%
  kable_styling(latex_options = c("repeat_header"), font_size = 10, repeat_header_method = "replace")

在此处输入图像描述


推荐阅读