Как раскрасить числовые ячейки столбцов, игнорируя векторы символов, представляющие NA в пакете gt из R

#r #gt

Вопрос:

Для фиктивных данных выполните следующие действия:

 df <- structure(list(id = 1:4, v1 = c("/", "0.2", "0.3", "0.4"), v2 = c(0.8, 
0.2, 0.1, 0.5), change = c("/", "0", "-0.2", "0.1")), class = "data.frame", row.names = c(NA, 
-4L))
 

С помощью приведенного ниже кода я могу легко раскрасить v2 gt пакет из R, так как его тип данных numeric :

 library(tidyverse)
library(gt)

df %>%
  gt() %>%
  data_color(
    columns = "v2",
    colors = scales::col_numeric(
      palette = paletteer::paletteer_d(
        palette = "ggsci::red_material"
        ) %>% as.character(),
      domain = NULL
      )
  )
 

Из:

введите описание изображения здесь

Теперь я v1 также хотел бы раскрасить (пожалуйста, обратите внимание, что тип dtype этого столбца char ) и отобразить NA с / помощью (так как выходная цифра будет использоваться в отчете, поэтому я хочу или - как символ для представления NA или NaN вместо использования символа NA по умолчанию R).

Итак, мой вопрос в том, возможно ли это сделать? Если да, то как? Спасибо за вашу помощь заранее.

введите описание изображения здесь

Редактировать:

 library(tidyverse)
library(gt)
library(paletteer)

na_palette <- paletteer::paletteer_d(palette = "ggsci::red_material") 
na_palette[1] <- "#FFFFFFFF" # replace  "/" with white

df %>%
  gt() %>%
  data_color(
    columns = "v2",
    colors = scales::col_numeric(
      palette = paletteer::paletteer_d(
        palette = "ggsci::red_material"
      ) %>% as.character(),
      domain = NULL
    )
  ) %>%
  data_color(
    columns = "v1",
    colors = scales::col_factor(
      na.color = "white",
      palette = na_palette %>% as.character(),#use the palette
      domain = NULL
    )
  )%>%
  data_color(
    columns = "change",
    colors = scales::col_factor(
      na.color = "white",
      palette = na_palette %>% as.character(),#use the palette
      domain = NULL
    )
  )
 

Из:

введите описание изображения здесь

Ответ №1:

вы можете добавить еще gt::data_color один вызов в свой канал:

 df %>%
  gt() %>%
  data_color(
    columns = "v2",
    colors = scales::col_numeric(
      palette = paletteer::paletteer_d(
        palette = "ggsci::red_material"
      ) %>% as.character(),
      domain = NULL
    )
  )%>%
  data_color(
    columns = "v1",
    colors = scales::col_factor(
      palette = paletteer::paletteer_d(
        palette = "ggsci::red_material"
      ) %>% as.character(),
      domain = NULL
    )
  )
 

в этом случае вам просто нужно изменить scales::col_numeric scales::col_factor значение, которое задает цвета для значений вашего персонажа

изменить: если вы хотите установить значение / белый:

 na_palette <- paletteer::paletteer_d(palette = "ggsci::red_material") # get the palette

na_palette[1] <- "#FFFFFFFF" # replace  "/" with white


df %>%
  dplyr::mutate(
    change = factor(change, levels = change),
    v1 = factor(v1, levels = v1)
  ) %>% 
  gt() %>%
  data_color(
    columns = "v2",
    colors = scales::col_numeric(
      palette = paletteer::paletteer_d(
        palette = "ggsci::red_material"
      ) %>% as.character(),
      domain = NULL
    )
  ) %>%
  data_color(
    columns = c("v1", "change"),
    colors = scales::col_factor(
      palette = na_palette %>% as.character(),#use the palette
      domain = NULL
    )
  )
 

Из:

введите описание изображения здесь

Комментарии:

1. Извините, цвет представляет значения, если он больше или меньше, поэтому я обновил код, пожалуйста, проверьте с обновленным palette .

2. все еще должен работать с scales::col_factor for v1, я обновил ответ

3. Извините, я ошибся. Кстати, можно ли не устанавливать цвет для ячейки / , так как она представляет NA s?

4. я адаптировал свой ответ, вы также можете подумать об n = NROW(df) paletteer::paletteer_d этом , поэтому каждое значение также получает цвет

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