Условное форматирование ячеек в одном столбце путем сравнения его со значением из другого столбца с использованием Kable
Я новичок в R, и мы знаем, что в Excel очень легко условно отформатировать ячейку (изменить цвет фона), сравнив ее с другим столбцом.
Я пытался сделать это в R, используя KableExtra. Но мне не удалось получить значение из другого ряда и сравнить его. Моя задача состояла в том, чтобы сделать ячейку зеленой, желтой или красной, сравнивая ячейку в другом столбце в той же строке.
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) в зависимости от значения в столбце mtcars $ gear.
Может кто-нибудь помочь мне, плз? ТИА
1 ответ
Вопрос в том виде, в котором он написан, немного неясен, однако я попытаюсь продемонстрировать решение, основанное на моем понимании.
Прежде всего, я не уверен, что вы пытаетесь достичь с помощью функции multirow_spec
как функция пакета row_spec
уже векторизовано для варианта row
... хотя и не для background
,
Во-вторых, я предполагаю, что вы хотите, чтобы цвета варьировались в зависимости от предыдущего значения в том же столбце (шестерне), как это указано в вопросе. Мы изменим столбец, используя mutate
, case_when
, а также lag
все из дплыр. Мы будем использовать 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)
NB Опция
escape = FALSE
требуется, чтобы HTML- контент, созданный сcell_spec
не сбежал.
<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>