【问题标题】:R kable/kableExtra, conditional formatting by percentage (with missing values)R kable/kableExtra,按百分比的条件格式(有缺失值)
【发布时间】:2021-05-15 04:59:24
【问题描述】:

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

我尝试了this post 中的一些方法,但不喜欢不给整个单元格着色的cell_spec 背景着色,所以更愿意在kable 中使用column_spec。然而,我发现显示百分比的所有选项都将百分比转换为字符变量,这限制了我进行条件格式设置的能力。

当我简化示例代码以在此处发布时(经过几个小时的错误),我终于使用 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"))

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

谢谢!

【问题讨论】:

    标签: r percentage conditional-formatting kable kableextra


    【解决方案1】:

    为标签创建一个单独的列并使用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'))
    

    【讨论】:

      【解决方案2】:

      我们可以使用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)
         )   
      

      【讨论】:

        猜你喜欢
        • 2021-09-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-19
        • 2019-01-16
        • 2010-09-06
        相关资源
        最近更新 更多