Używam przecen R w połączeniu z LaTeXem do tworzenia raportów PDF. Do generowania stolików używam pakietu kableExtra.

Chciałbym zmienić stylizację wierszy na podstawie wartości w określonej kolumnie. Próbowałem cell_spec, ale o ile widzę, zmienia tylko stylizację wartości w kolumnie, a nie w całym wierszu.

Na przykład w poniższej tabeli chciałbym wyróżnić wszystkie samochody z więcej niż sześcioma cylindrami. Wynik powinien więc wyglądać tak:

library(knitr)
library(kableExtra)
library(tidyverse)

mtcars |> 
  slice(1:5) |> 
  select(mpg:wt) |>
  kable(booktabs = T) %>%
  kable_styling() %>%
  row_spec(5, bold = T, color = "white", background = "red")

enter image description here

Ale tutaj podałem numer wiersza, czego nie chcę robić. Powinna być ustalana automatycznie na podstawie liczby cylindrów. Używając cell_spec, mogę uzyskać następujące informacje:

mtcars |> 
  slice(1:5) |> 
  select(mpg:wt) |>
  rownames_to_column('cars') %>% # used to store row names (mutate deletes them)
  mutate(
  cyl = cell_spec(cyl, color = ifelse(cyl > 6, "white", "black"),
                  background = ifelse(cyl > 6, "red", "white"),
                  bold = ifelse(cyl > 6, T, F))) %>%
  column_to_rownames('cars') %>% # used to put row names back in place
  kable(escape = F, booktabs = T) %>%
  kable_styling()

enter image description here

Ale to zmienia tylko wartość w kolumnie cylindra, a nie w pozostałej części wiersza.

Czy istnieje rozwiązanie mojego problemu (najlepiej bez określania warunku dla każdej opcji stylizacji)?

EDYTOWAĆ: To jest inne pytanie niż to, gdzie ktoś chce aby sformatować kolumnę na podstawie wartości w tej kolumnie, ale chce wykluczyć pewne wiersze/wpisy. Nie chcę wykluczać żadnych wierszy, ale chcę, aby formatowanie dotyczyło całego wiersza (nadal zależy od wartości w określonej kolumnie).

19
SPK.z 16 listopad 2018, 18:45
Uwaga: w wynikowym lateksie kod to: '\cellcolor{red}{\textcolor{white}{\textbf{8}}}' dla podświetlonej komórki. Jeśli chcesz skompilować ten kod w innym miejscu (np. na odwrocie), musisz dołączyć pakiet lateksowy "colortbl", który zapewnia obsługę \cellcolor
 – 
Brian D
15 październik 2020, 20:49

1 odpowiedź

Najlepsza odpowiedź

Myślę, że najłatwiejszym sposobem jest przekazanie listy wierszy do pokolorowania na podstawie twoich kryteriów.

library(kableExtra)

df<- mtcars
color.me <- which(df$cyl >6)

df %>% 
  kable(booktabs = T) %>%
  kable_styling() %>%
  row_spec(color.me, bold = T, color = "white", background = "red")

Lub w tej samej rurze co:

df %>% 
  kable(booktabs = T) %>%
  kable_styling() %>%
  row_spec(which(df$cyl >6), bold = T, color = "white", background = "red")
22
Jrakru56 16 listopad 2018, 19:02