#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, я хочу научиться извлекать эти значения. Я думаю, что задам еще один вопрос по этому вопросу. Спасибо вам за ваше время и терпение, чтобы ответить на это сомнение!