【问题标题】:Conditionally formatting cells in one column by comparing it with the value from another column using Kable通过使用 Kable 将一列中的单元格与另一列中的值进行比较,对单元格进行条件格式化
【发布时间】:2018-11-13 10:30:11
【问题描述】:

我是 R 新手,我们知道在 Excel 中通过与另一列进行比较来有条件地格式化单元格(更改背景颜色)非常容易。

我尝试使用 KableExtra 在 R 中执行此操作。但是我无法成功地从另一行获取值并进行比较。我的任务是通过比较同一行中另一列上的单元格来使单元格显示为绿色、黄色或红色。

library(kableExtra)
library(dplyr)
library(knitr)
multirow_spec <- function(x, rows, ...) {
  for (row in rows) 
    x <- kableExtra::row_spec(x, row, ...)
  x
}

x <- knitr::kable(head(mtcars), "html")
multirow_spec(x, c(1, 3, 4), background="red")
x

以上代码成功无条件改变整行的背景色。现在我想要的是根据 mtcars$gear 列下的值将单元格颜色更改为绿色(>mtcars$gear)或黄色(=mtcars$gear)或红色('

有人可以帮我吗? TIA

【问题讨论】:

    标签: r kable kableextra


    【解决方案1】:

    所写的问题有点不清楚,但是,我将尝试根据我的理解展示一个解决方案。

    首先,我不确定您要使用函数 multirow_spec 来完成什么,因为包函数 row_spec 已经针对选项 row 进行了矢量化...虽然不是针对 background

    其次,我假设您希望颜色根据同一列(齿轮)中的前一个值而变化,因为这是问题中唯一提到的一个。我们将使用来自mutatecase_whenlag 修改列。我们将使用cell_spec 来定位各个单元格值。

    library(dplyr)
    library(knitr)
    library(kableExtra)
    
    mtcars %>%
      slice(1:10) %>%
      mutate(
        gear = case_when(
          gear > lag(gear) ~ cell_spec(gear, background = "green"),
          gear == lag(gear) ~ cell_spec(gear, background = "yellow"),
          gear < lag(gear) ~ cell_spec(gear, background = "red")
      )) %>%
      kable("html", escape = FALSE)
    

    注意选项escape = FALSE是必需的,这样cell_spec生成的html内容不会被转义。

    <table>
      <thead>
        <tr>
          <th style="text-align:right;"> mpg </th>
          <th style="text-align:right;"> cyl </th>
          <th style="text-align:right;"> disp </th>
          <th style="text-align:right;"> hp </th>
          <th style="text-align:right;"> drat </th>
          <th style="text-align:right;"> wt </th>
          <th style="text-align:right;"> qsec </th>
          <th style="text-align:right;"> vs </th>
          <th style="text-align:right;"> am </th>
          <th style="text-align:left;"> gear </th>
          <th style="text-align:right;"> carb </th>
        </tr>
      </thead>
      <tbody>
        <tr>
          <td style="text-align:right;"> 21.0 </td>
          <td style="text-align:right;"> 6 </td>
          <td style="text-align:right;"> 160.0 </td>
          <td style="text-align:right;"> 110 </td>
          <td style="text-align:right;"> 3.90 </td>
          <td style="text-align:right;"> 2.620 </td>
          <td style="text-align:right;"> 16.46 </td>
          <td style="text-align:right;"> 0 </td>
          <td style="text-align:right;"> 1 </td>
          <td style="text-align:left;"> NA </td>
          <td style="text-align:right;"> 4 </td>
        </tr>
        <tr>
          <td style="text-align:right;"> 21.0 </td>
          <td style="text-align:right;"> 6 </td>
          <td style="text-align:right;"> 160.0 </td>
          <td style="text-align:right;"> 110 </td>
          <td style="text-align:right;"> 3.90 </td>
          <td style="text-align:right;"> 2.875 </td>
          <td style="text-align:right;"> 17.02 </td>
          <td style="text-align:right;"> 0 </td>
          <td style="text-align:right;"> 1 </td>
          <td style="text-align:left;"> <span style="     border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: yellow;">4</span> </td>
          <td style="text-align:right;"> 4 </td>
        </tr>
        <tr>
          <td style="text-align:right;"> 22.8 </td>
          <td style="text-align:right;"> 4 </td>
          <td style="text-align:right;"> 108.0 </td>
          <td style="text-align:right;"> 93 </td>
          <td style="text-align:right;"> 3.85 </td>
          <td style="text-align:right;"> 2.320 </td>
          <td style="text-align:right;"> 18.61 </td>
          <td style="text-align:right;"> 1 </td>
          <td style="text-align:right;"> 1 </td>
          <td style="text-align:left;"> <span style="     border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: yellow;">4</span> </td>
          <td style="text-align:right;"> 1 </td>
        </tr>
        <tr>
          <td style="text-align:right;"> 21.4 </td>
          <td style="text-align:right;"> 6 </td>
          <td style="text-align:right;"> 258.0 </td>
          <td style="text-align:right;"> 110 </td>
          <td style="text-align:right;"> 3.08 </td>
          <td style="text-align:right;"> 3.215 </td>
          <td style="text-align:right;"> 19.44 </td>
          <td style="text-align:right;"> 1 </td>
          <td style="text-align:right;"> 0 </td>
          <td style="text-align:left;"> <span style="     border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: red;">3</span> </td>
          <td style="text-align:right;"> 1 </td>
        </tr>
        <tr>
          <td style="text-align:right;"> 18.7 </td>
          <td style="text-align:right;"> 8 </td>
          <td style="text-align:right;"> 360.0 </td>
          <td style="text-align:right;"> 175 </td>
          <td style="text-align:right;"> 3.15 </td>
          <td style="text-align:right;"> 3.440 </td>
          <td style="text-align:right;"> 17.02 </td>
          <td style="text-align:right;"> 0 </td>
          <td style="text-align:right;"> 0 </td>
          <td style="text-align:left;"> <span style="     border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: yellow;">3</span> </td>
          <td style="text-align:right;"> 2 </td>
        </tr>
        <tr>
          <td style="text-align:right;"> 18.1 </td>
          <td style="text-align:right;"> 6 </td>
          <td style="text-align:right;"> 225.0 </td>
          <td style="text-align:right;"> 105 </td>
          <td style="text-align:right;"> 2.76 </td>
          <td style="text-align:right;"> 3.460 </td>
          <td style="text-align:right;"> 20.22 </td>
          <td style="text-align:right;"> 1 </td>
          <td style="text-align:right;"> 0 </td>
          <td style="text-align:left;"> <span style="     border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: yellow;">3</span> </td>
          <td style="text-align:right;"> 1 </td>
        </tr>
        <tr>
          <td style="text-align:right;"> 14.3 </td>
          <td style="text-align:right;"> 8 </td>
          <td style="text-align:right;"> 360.0 </td>
          <td style="text-align:right;"> 245 </td>
          <td style="text-align:right;"> 3.21 </td>
          <td style="text-align:right;"> 3.570 </td>
          <td style="text-align:right;"> 15.84 </td>
          <td style="text-align:right;"> 0 </td>
          <td style="text-align:right;"> 0 </td>
          <td style="text-align:left;"> <span style="     border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: yellow;">3</span> </td>
          <td style="text-align:right;"> 4 </td>
        </tr>
        <tr>
          <td style="text-align:right;"> 24.4 </td>
          <td style="text-align:right;"> 4 </td>
          <td style="text-align:right;"> 146.7 </td>
          <td style="text-align:right;"> 62 </td>
          <td style="text-align:right;"> 3.69 </td>
          <td style="text-align:right;"> 3.190 </td>
          <td style="text-align:right;"> 20.00 </td>
          <td style="text-align:right;"> 1 </td>
          <td style="text-align:right;"> 0 </td>
          <td style="text-align:left;"> <span style="     border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: green;">4</span> </td>
          <td style="text-align:right;"> 2 </td>
        </tr>
        <tr>
          <td style="text-align:right;"> 22.8 </td>
          <td style="text-align:right;"> 4 </td>
          <td style="text-align:right;"> 140.8 </td>
          <td style="text-align:right;"> 95 </td>
          <td style="text-align:right;"> 3.92 </td>
          <td style="text-align:right;"> 3.150 </td>
          <td style="text-align:right;"> 22.90 </td>
          <td style="text-align:right;"> 1 </td>
          <td style="text-align:right;"> 0 </td>
          <td style="text-align:left;"> <span style="     border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: yellow;">4</span> </td>
          <td style="text-align:right;"> 2 </td>
        </tr>
        <tr>
          <td style="text-align:right;"> 19.2 </td>
          <td style="text-align:right;"> 6 </td>
          <td style="text-align:right;"> 167.6 </td>
          <td style="text-align:right;"> 123 </td>
          <td style="text-align:right;"> 3.92 </td>
          <td style="text-align:right;"> 3.440 </td>
          <td style="text-align:right;"> 18.30 </td>
          <td style="text-align:right;"> 1 </td>
          <td style="text-align:right;"> 0 </td>
          <td style="text-align:left;"> <span style="     border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: yellow;">4</span> </td>
          <td style="text-align:right;"> 4 </td>
        </tr>
      </tbody>
    </table>

    【讨论】:

    • 非常感谢您的详尽回答。是的,我的问题并不清楚,但您仍然回答了...您能告诉我如何更改这些单个单元格而不是整行的颜色吗?
    • @doctshinds,请参阅上面的编辑。请注意,vignette 包中也很好地涵盖了这一点。
    猜你喜欢
    • 1970-01-01
    • 2014-11-24
    • 1970-01-01
    • 2022-01-02
    • 2023-01-26
    • 1970-01-01
    • 2013-06-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多