【问题标题】:Conditional formatting kableextra, group and color cell with maximum value具有最大值的条件格式 kableextra、组和颜色单元格
【发布时间】:2021-01-15 07:19:57
【问题描述】:

我有以下格式的数据框

使用 kableExtra 我想在 yr 列上进行分组,然后为 ab 和 cd 为具有最大值的单元格着色。这样在 ab 中的第 3 和第 6 行将是红色的,在 cd 中的第 3 和第 5 行。我尝试了类似的东西

library(kableExtra)
sp %>% group_by(yr) %>%
mutate_if(is.numeric, function(x){
  cell_spec(x, "html", color  = ifelse(x >= lag(x) & x >= lead(x), "red", "green"))
} ) %>%
kable(format = "html", escape = F) %>%
kable_styling("striped", full_width = F)

但没有骰子。有什么建议吗?

可重现的数据框

yr <- c(2000, 2000, 2000, 2005, 2005, 2005)
ab <- c(1, 6, 11, 12, 3 , 14)
cd <- c(3, 7, 19, 3, 77, 4)

sp <- as.data.frame(cbind(yr, ab, cd))
sp$ab <- as.numeric(sp$ab)
sp$cd <- as.numeric(sp$cd)

谢谢!

【问题讨论】:

    标签: r kableextra


    【解决方案1】:

    将代码中的mutate_if(...) 更改为

    mutate_if(is.numeric, ~ cell_spec(., "html", color=ifelse(.==max(.), "red", "green"))))
    

    (以dplyr的现代写作方式)

    mutate(across(where(is.numeric), ~ cell_spec(., "html", color=ifelse(.==max(.), "red", "green"))))
    

    提供如下html表格

    <table class="table table-striped" style="width: auto !important; margin-left: auto; margin-right: auto;">
     <thead>
      <tr>
       <th style="text-align:right;"> yr </th>
       <th style="text-align:left;"> ab </th>
       <th style="text-align:left;"> cd </th>
      </tr>
     </thead>
    <tbody>
      <tr>
       <td style="text-align:right;"> 2000 </td>
       <td style="text-align:left;"> <span style="color: green !important;">1</span> </td>
       <td style="text-align:left;"> <span style="color: green !important;">3</span> </td>
      </tr>
      <tr>
       <td style="text-align:right;"> 2000 </td>
       <td style="text-align:left;"> <span style="color: green !important;">6</span> </td>
       <td style="text-align:left;"> <span style="color: green !important;">7</span> </td>
      </tr>
      <tr>
       <td style="text-align:right;"> 2000 </td>
       <td style="text-align:left;"> <span style="color: red !important;">11</span> </td>
       <td style="text-align:left;"> <span style="color: red !important;">19</span> </td>
      </tr>
      <tr>
       <td style="text-align:right;"> 2005 </td>
       <td style="text-align:left;"> <span style=" color: green !important;">12</span> </td>
       <td style="text-align:left;"> <span style="color: green !important;">3</span> </td>
      </tr>
      <tr>
       <td style="text-align:right;"> 2005 </td>
       <td style="text-align:left;"> <span style=" color: green !important;">3</span> </td>
       <td style="text-align:left;"> <span style="color: red !important;">77</span> </td>
      </tr>
      <tr>
       <td style="text-align:right;"> 2005 </td>
       <td style="text-align:left;"> <span style="color: red !important;">14</span> </td>
       <td style="text-align:left;"> <span style="color: green !important;">4</span> </td>
      </tr>
    </tbody>
    </table>
    

    【讨论】:

    • 谢谢!当我这样做时会发生一些奇怪的事情 - 它在列之间的颜色不一致。对于第一列,它仅在该单元格恰好是第三行的情况下为最大单元格着色。在第二列中,仅当该单元格恰好位于第二行等时才为最大单元格着色(我的实际数据集要大得多)。知道为什么会这样吗?
    • 对不起,我不明白你的意思...对于您的示例数据,ab11 和 14 /b> 列和 cd 列中的 1977 应为红色,其他为绿色,则红色的行不同列之间。只是为了确保,我添加了将由代码提供的 html 表。请检查一下,如果有什么问题,请告诉我。
    • 它似乎在这个例子中工作 - 您发布的 html 的颜色正确。但实际数据仍然存在问题。以可重现的数据为例,发生的情况是 ab 11 和 14 将是红色的,因为它们恰好都在第三行(对于组)。但是对于 cd,由于某种原因,它会将 77 染成红色,而不是 19。该列中最大值位于第二行(对于组)的每个实例都被染成红色,但不是其他的。那有意义吗?不幸的是,html太长太长无法发布。再次感谢!
    • 抱歉给您添麻烦了——我似乎发现了这个问题。我分组的变量之一以空格命名,因此当我调用它时,我使用的是“”。当我将问题重命名为一个单词时,代码运行良好!不知道这可能是一个问题!感谢您的帮助
    • 当列名中有空格时,我们应该在它周围加上反引号而不是引号。不管怎样,很高兴听到你解决了这个问题:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多