R kable/kableExtra,按百分比进行条件格式化(有缺失值)

R kable/kableExtra, conditional formatting by percentage (with missing values)

我正在使用 kable 和 kableExtra 并想显示一个 table 和百分比列(格式为“95%”)。我还想根据百分比值(具有多种颜色和切割点)对单元格背景进行条件格式化。另外,还有少量的NA混入。

我尝试了中的一些方法,但不喜欢cell_spec不遮挡整个单元格的背景阴影,所以更愿意使用column_spec凯布尔内。但是,我发现显示百分比的所有选项都将百分比转换为字符变量,这限制了我执行条件格式设置的能力。

当我在这里将我的示例代码简化为 post 时(经过几个小时的错误),我终于使用 startWith 让它工作了(在这种情况下这是一个不错的解决方案,因为我的分割点是 80 % 和 90%,但并不适用于所有情况。

df <- tibble(
          x=c(1:6),
          percents =c (1, .95, .82, .77, .62, NA)
          )
    
df$percents <- percent(df$percents, accuracy = 1)

kable(df, booktabs=TRUE, escape=FALSE ) %>% 
   kable_styling() %>% 
  column_spec(2, background = if_else(startsWith(df$percents, '100'), "Darkgrey", 
                              if_else(startsWith(df$percents, '9'), "Darkgrey", 
                              if_else(startsWith(df$percents, '8'), "silver", "lightgray", 
                              "white"), "white"), "white"))

我很好奇是否有人对此有另一种解决方案,可以保留将百分比值作为数字而不是字符来使用的能力。

谢谢!

为标签创建一个单独的列并使用case_when与数字进行比较。

library(knitr)
library(kableExtra)

df <- tibble::tibble(
  x=c(1:6),
  percents =c (1, .95, .82, .77, .62, NA)
)

df$percent_label <- scales::percent(df$percents, accuracy = 1)

kable(df[-2], booktabs=TRUE, escape=FALSE ) %>% 
  kable_styling() %>% 
  column_spec(2, background = case_when(df$percents > 0.9 ~ 'darkgrey', 
                                        df$percents > 0.8 ~ 'silver', 
                                        is.na(df$percents) ~ 'white', 
                                        TRUE ~ 'lightgray'))

我们可以使用 formattable::percent 来保持 type 完整

df$percents = formattable::percent(df$percents, digits = 0) 
kable(df, booktabs=TRUE, escape=FALSE ) %>% 
   kable_styling() %>% 
   column_spec(2, background = case_when(df$percents > 0.9 ~ 'darkgrey', 
                                    df$percents > 0.8 ~ 'silver', 
                                    is.na(df$percents) ~ 'white', 
                                    TRUE ~ 'lightgray'))

数据

df <- tibble::tibble(
  x=c(1:6),
   percents =c (1, .95, .82, .77, .62, NA)
   )