Kable с выделением наибольшего значения в каждом ряду (R - Knitr)

Давайте использовать этот фрейм данных:

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), я хотел бы также видеть самое высокое значение в строке. Как я могу сделать это, используя предыдущую функцию?

Как настроить Tailwind CSS с React.js и Next.js?
Как настроить Tailwind CSS с React.js и Next.js?
Tailwind CSS - единственный фреймворк, который, как я убедился, масштабируется в больших командах. Он легко настраивается, адаптируется к любому...
LeetCode запись решения 2536. Увеличение подматриц на единицу
LeetCode запись решения 2536. Увеличение подматриц на единицу
Увеличение подматриц на единицу - LeetCode
Переключение светлых/темных тем
Переключение светлых/темных тем
В Microsoft Training - Guided Project - Build a simple website with web pages, CSS files and JavaScript files, мы объясняем, как CSS можно...
Отношения &quot;многие ко многим&quot; в Laravel с методами присоединения и отсоединения
Отношения &quot;многие ко многим&quot; в Laravel с методами присоединения и отсоединения
Отношения "многие ко многим" в Laravel могут быть немного сложными, но с помощью Eloquent ORM и его моделей мы можем сделать это с легкостью. В этой...
В PHP
В PHP
В большой кодовой базе с множеством различных компонентов классы, функции и константы могут иметь одинаковые имена. Это может привести к путанице и...
Карта дорог Беладжар PHP Laravel
Карта дорог Беладжар PHP Laravel
Laravel - это PHP-фреймворк, разработанный для облегчения разработки веб-приложений. Laravel предоставляет различные функции, упрощающие разработку...
1
0
78
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вот способ использования 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)
...

Привет @Julian, спасибо, но в вашем примере вы извлекаете самое высокое значение в каждом столбце, а не самое высокое значение в каждой строке. Как можно было бы адаптировать код для использования строк, а не столбцов?

antecessor 22.11.2022 10:24

Мой плохой, я делаю правку

Julian 22.11.2022 11:28

Спасибо, небольшое замечание. Как мы можем избавиться от значений NaN?

antecessor 22.11.2022 11:42

Хотите, чтобы записи были пустыми? Или заполнены "-"?

Julian 22.11.2022 11:44

Пустой мой выбор

antecessor 22.11.2022 11:45

Я отредактировал строку mutate(across(everything(), ~ ifelse(.x == "NaN", "", .)))

Julian 22.11.2022 11:56

Спасибо. Это любопытно, потому что когда я запускаю это в RStudio, я вижу выделенные значения. Однако, когда я вяжу в HTML, выделенные значения не раскрашиваются, есть идеи @Julian?

antecessor 22.11.2022 12:18

Для меня это работает нормально, я добавляю yaml для .qmd, чтобы вы могли его протестировать.

Julian 22.11.2022 13:33

Другие вопросы по теме