Давайте использовать этот фрейм данных:
x <- structure(list(`A. afarensis` = c(NaN, 41.624448481617, NaN,
44.3444026007235, 45.637877314444), `A. africanus` = c(NaN, 40.8108406931158,
NaN, 17.6702611050343, 28.8624817479424), `A. anamensis` = c(NaN,
3.96543899879134, NaN, 13.4563973882188, 7.02306143133709), `Ar. ramidus` = c(NaN,
3.31720723035651e-05, NaN, 0.00154294031842416, 7.49122553868537e-05
), Australopithecus = c(NaN, 6.97874566506872, NaN, 4.99347711237018,
6.04930517572641), tooth = c("M1", "M1", "M1", "M1", "M1")), row.names = c("1",
"2", "3", "4", "5"), class = "data.frame")
Я хотел бы выделить жирным шрифтом и красным цветом фона самое высокое значение в строке, от столбца A. afarensis
до Australopithecus
Я создал эту функцию:
fun_kable <- function(data){
kable(data, digits = 2) %>%
kable_classic(full_width = T,
html_font = "Cambria",
font_size = 10) %>%
column_spec(ncol(data), bold = T, italic = T, color = "red")
}
Когда я запускаю fun_kable(x)
, я хотел бы также видеть самое высокое значение в строке. Как я могу сделать это, используя предыдущую функцию?
Вот способ использования cell_spec()
. Обратите внимание, что округление должно быть выполнено заранее, так как использование cell_spec
преобразует переменную в символ. Вы можете увеличить количество цифр, если три 0 в столбце Ar.ramidus для вас проблематичны.
Максимум строки:
library(dplyr)
library(kableExtra)
max_values <- x |>
mutate(across(where(is.numeric), round, 2)) |>
select(-tooth) |>
purrr::pmap(pmax, na.rm = TRUE) |>
as.numeric() |>
na.omit()
x |>
mutate(across(where(is.numeric), round, 2)) |>
mutate(across(-tooth, ~ if_else(row_number() %in% which(.x %in% max_values),
cell_spec(.x,
format = "html",
color = "red", bold = TRUE
), as.character(.x)
))) |>
mutate(across(everything(), ~ ifelse(.x == "NaN", "", .))) |>
kable(escape = FALSE) |>
kable_classic(
full_width = T,
html_font = "Cambria",
font_size = 10
)
Максимум столбца:
library(dplyr)
library(kableExtra)
"2", "3", "4", "5"), class = "data.frame")
max_values <- x |>
mutate(across(where(is.numeric), round, 2)) |>
summarise(across(-tooth, max, na.rm = TRUE)) |> as.vector() |> unname()
x |>
mutate(across(where(is.numeric), round, 2)) |>
mutate(across(-tooth, ~if_else(row_number() %in% which(.x %in% max_values),
cell_spec(.x,format = "html",
color = "red", bold = TRUE), as.character(.x)))) |>
kable(escape = FALSE) |>
kable_classic(full_width = T,
html_font = "Cambria",
font_size = 10)
test.qmd
---
title: "test"
format: html
---
```{r}
#| echo: false
#| warning: false
#| message: false
library(dplyr)
library(kableExtra)
...
Мой плохой, я делаю правку
Спасибо, небольшое замечание. Как мы можем избавиться от значений NaN?
Хотите, чтобы записи были пустыми? Или заполнены "-"?
Пустой мой выбор
Я отредактировал строку mutate(across(everything(), ~ ifelse(.x == "NaN", "", .)))
Спасибо. Это любопытно, потому что когда я запускаю это в RStudio, я вижу выделенные значения. Однако, когда я вяжу в HTML, выделенные значения не раскрашиваются, есть идеи @Julian?
Для меня это работает нормально, я добавляю yaml для .qmd, чтобы вы могли его протестировать.
Привет @Julian, спасибо, но в вашем примере вы извлекаете самое высокое значение в каждом столбце, а не самое высокое значение в каждой строке. Как можно было бы адаптировать код для использования строк, а не столбцов?