KableExtra условно форматирует определенные строки в столбце - PullRequest
0 голосов
/ 03 июня 2018

Я только что выучил KableExtra и знаю, как использовать условное форматирование всего столбца с помощью mutate (), как объяснено в документе с использованием mutate, например:

mutate(
   mpg = cell_spec(mpg, background = ifelse(mpg > 20, "red", "blue"))
)

Но я не знаю, чтоКак изменить цвета фона только определенных строк в каждом столбце, пока отображаются все строки.

Например, мои данные:

df <- data.frame( region1 = c("A", sample(1:5,3)),
                  region2 = c("B", sample(1:5,3)),
                  region3 = c("C", sample(1:5,3)),
                  region4 = c("A", sample(1:5,3)) )

Теперь я хочу отформатировать только вторую и третьюстрока.Я не хочу менять цвет фона первой и последней строки.Эти второй и третий ряды должны быть «красными», если они выше 1, или желтыми, если они равны 1, или зелеными, если их значение меньше 1.

Кто-нибудь может мне помочь?

Ответы [ 2 ]

0 голосов
/ 04 июня 2018

Вот пример, который игнорирует первую и последнюю строки и цвета в соответствии со значением, как вы говорите, но игнорирует буквы.

Сначала я загружаю библиотеки.

# Load libraries
library(knitr)
library(kableExtra)

ДалееЯ создаю фиктивный фрейм данных.

# Create data frame   
df <- data.frame( region1 = c(sample(c(-5:5, letters[1:5]), 10, replace = TRUE)),
                  region2 = c(sample(c(-5:5, letters[1:5]), 10, replace = TRUE)),
                  region3 = c(sample(c(-5:5, letters[1:5]), 10, replace = TRUE)),
                  region4 = c(sample(c(-5:5, letters[1:5]), 10, replace = TRUE)), stringsAsFactors = FALSE )

Здесь я определяю функцию для форматирования ячеек.Я игнорирую первую и последнюю строки и проверяю, является ли символ буквой или цифрой, а затем цвет соответственно.

foo <- function(x, n, nmax){
  cell_spec(x, background = ifelse(is.na(as.numeric(x)), "white",
                                   ifelse(n == nmax | n == 1, "white",
                                          ifelse(x > 1, "red",
                                                 ifelse(x < 1, "green", "yellow")))))
}

Наконец, я применяю функцию.

df %>% 
  mutate_all(funs(foo(., n = row_number(), nmax = n()))) %>% 
  kable(escape = FALSE) %>% 
  kable_styling()
0 голосов
/ 03 июня 2018

Это не очень хороший дизайн для фрейма данных: все столбцы должны быть одного типа, поэтому ваши числа будут приведены к символу.

Тем не менее, вы можете сделать то, что вы просите, следующим образом.

fixcol <- function(col) {
  x <- as.numeric(col[2:3])
  x <- cell_spec(x, background = ifelse(x > 1, "red", ifelse(x == 1, "yellow", "green")))
  col[2:3] <- x
  col
}

df <- as.data.frame(lapply(df, fixcol))
kable(df, escape = FALSE)
...