Я хочу создать таблицу gt, в которой я вижу некоторые показатели, такие как количество наблюдений, среднее значение и медиана, и мне нужен столбец с его гистограммой. Для этого вопроса я буду использовать набор данных радужной оболочки глаза.

Я недавно научился помещать сюжет в тиббл с помощью этого кода:

library(dplyr)
library(tidyr)
library(purrr)
library(gt)
my_tibble <- iris %>%
  pivot_longer(-Species, 
               names_to = "Vars", 
               values_to = "Values") %>%
  group_by(Vars) %>%
  summarise(obs = n(),
            mean = round(mean(Values),2),
            median = round(median(Values),2), 
            plots = list(ggplot(cur_data(), aes(Values)) + geom_histogram()))

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

my_tibble %>%
  mutate(ggplot = NA) %>%
  gt() %>%
  text_transform(
    locations = cells_body(vars(ggplot)),
    fn = function(x) {
      map(.$plots,ggplot_image)
    }
  )

Но он возвращает мне ошибку:

Error in body[[col]][stub_df$rownum_i %in% loc$rows] <- fn(body[[col]][stub_df$rownum_i %in%  : 
  replacement has length zero

Таблица gt должна быть такой: введите описание изображения здесь

Любая помощь будет оценена.

1
Alexis 11 Окт 2021 в 22:55

3 ответа

Лучший ответ

Нам нужно перебрать plots

library(dplyr)
library(tidyr)
library(purrr)
library(gt)
library(ggplot2)
iris %>%
  pivot_longer(-Species, 
               names_to = "Vars", 
               values_to = "Values") %>%
  nest_by(Vars) %>%
  mutate(n = nrow(data),
         mean = round(mean(data$Values), 2), 
         median = round(median(data$Values), 2), 
         plots = list(ggplot(data, aes(Values)) + geom_histogram()), .keep = "unused") %>%
  ungroup %>%
  mutate(ggplot = NA) %>%
  {dat <- .
  dat %>%
    select(-plots) %>%
    gt() %>%
  text_transform(locations = cells_body(c(ggplot)),
                 fn = function(x) {
                  map(dat$plots, ggplot_image, height = px(100))
                 }
                 
                 
                 )
  }

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

2
akrun 11 Окт 2021 в 22:22

Обновление: См. комментарии:

Для ваших целей в соответствии с блестящим приложением вы можете использовать summarytools см. Здесь: https://cran.r-project.org/web/packages/summarytools/vignettes/introduction.html

Он совместим с блестящим r!

Вот небольшой пример:

library(summarytools)
dfSummary(iris, 
          plain.ascii  = FALSE, 
          style        = "grid", 
          graph.magnif = 0.75, 
          valid.col    = FALSE,
          tmp.img.dir  = "/tmp")

view(dfSummary(iris))

enter image description here

Попробуй это:

library(skimr)
skim(iris)
  skim_variable n_missing complete_rate  mean    sd    p0   p25   p50   p75  p100 hist 
* <chr>             <int>         <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <chr>
1 Sepal.Length          0             1  5.84 0.828   4.3   5.1  5.8    6.4   7.9 ▆▇▇▅▂
2 Sepal.Width           0             1  3.06 0.436   2     2.8  3      3.3   4.4 ▁▆▇▂▁
3 Petal.Length          0             1  3.76 1.77    1     1.6  4.35   5.1   6.9 ▇▁▆▇▂
4 Petal.Width           0             1  1.20 0.762   0.1   0.3  1.3    1.8   2.5 ▇▁▇▅▃
2
TarJae 11 Окт 2021 в 20:58

Изучив отличные идеи от @akrun и @TarJae, у меня есть это решение, которое дает необходимую таблицу gt:

plots <- iris %>% 
  pivot_longer(-Species, 
               names_to = "Vars", 
               values_to = "Values") %>%
  group_by(Vars) %>%
  nest() %>%
  mutate(plot = map(data, 
                    function(df) df %>% 
                      ggplot(aes(Values)) + 
                      geom_histogram())) %>%
  select(-data)

iris %>%
  pivot_longer(-Species, 
               names_to = "Vars", 
               values_to = "Values") %>%
  group_by(Vars) %>%
  summarise(obs = n(),
            mean = round(mean(Values),2),
            median = round(median(Values),2)) %>%
  mutate(ggplot = NA) %>%
  gt() %>%
  text_transform(
    locations = cells_body(vars(ggplot)),
    fn = function(x) {
      map(plots$plot, ggplot_image, height = px(100))
    }
  )

А это таблица: введите описание изображения здесь

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

2
Alexis 11 Окт 2021 в 21:29