Гистограммы Nest ggplot для каждой переменной

#r #ggplot2 #dplyr #tidyverse

Вопрос:

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

Это моя первая попытка:

 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))
 

Так что это дает мне:

 # A tibble: 4 x 4
  Vars           obs  mean median
  <chr>        <int> <dbl>  <dbl>
1 Petal.Length   150  3.76   4.35
2 Petal.Width    150  1.2    1.3 
3 Sepal.Length   150  5.84   5.8 
4 Sepal.Width    150  3.06   3   
 

Это ожидаемая таблица:

 # A tibble: 4 x 5
  Vars           obs  mean median plot
  <chr>        <int> <dbl>  <dbl> <list>
1 Petal.Length   150  3.76   4.35 <gg>
2 Petal.Width    150  1.2    1.3  <gg>
3 Sepal.Length   150  5.84   5.8  <gg>
4 Sepal.Width    150  3.06   3    <gg>
 

Это то, что я пробовал:

 iris %>%
  pivot_longer(-Species, 
               names_to = "Vars", 
               values_to = "Values") %>%
  group_by(Vars) %>%
  nest() %>%
  mutate(metrics = lapply(data, function(df) df %>% summarise(obs = n(), mean = mean(Values), median = median(Values))),
         plots = lapply(data, function(df) df %>% ggplot(aes(Values))   geom_histogram()))
 

Почти на месте, я вижу это:

 # A tibble: 4 x 4
# Groups:   Vars [4]
  Vars         data               metrics          plots 
  <chr>        <list>             <list>           <list>
1 Sepal.Length <tibble [150 × 2]> <tibble [1 × 3]> <gg>  
2 Sepal.Width  <tibble [150 × 2]> <tibble [1 × 3]> <gg>  
3 Petal.Length <tibble [150 × 2]> <tibble [1 × 3]> <gg>  
4 Petal.Width  <tibble [150 × 2]> <tibble [1 × 3]> <gg>  
 

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

Ответ №1:

Мы можем использовать cur_data() in summarise и получить результат в a list , обернув

 library(dplyr)
library(ggplot2)
library(tidyr)
out <- 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()))
 

-выход

 out
# A tibble: 4 × 5
  Vars           obs  mean median plots 
  <chr>        <int> <dbl>  <dbl> <list>
1 Petal.Length   150  3.76   4.35 <gg>  
2 Petal.Width    150  1.2    1.3  <gg>  
3 Sepal.Length   150  5.84   5.8  <gg>  
4 Sepal.Width    150  3.06   3    <gg>  
 

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

1. Согласно документации, cur_data() приводятся текущие данные для текущей группы. Я не знал об этой функции, большое вам спасибо @akrun! Хорошего вам дня!

2. Кстати, мой метод использования гнезд был немного запутанным, не так ли?

3. @Alexis С nest_by помощью , вы можете получить тот же вывод, но затем должны извлечь их obs , mean и т. median Д

4. Привет @akrun, я хочу научиться извлекать эти значения. Я думаю, что задам еще один вопрос по этому вопросу. Спасибо вам за ваше время и терпение, чтобы ответить на это сомнение!