Усреднение значений в R с использованием операторов if - PullRequest
0 голосов
/ 28 ноября 2018

Для выборочного кадра данных:

df1 <- structure(list(name = c("a", "b", "c", "d", "e", "f", "g", "h", 
"i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", 
"v", "w", "x", "y", "z", "a", "b", "c", "d", "e", "f", "g", "h", 
"i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", 
"v", "w", "x", "y", "z", "a", "b", "c", "d", "e", "f", "g", "h", 
"i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", 
"v", "w", "x", "y", "z"), amount = c(5.5, 5.4, 5.2, 5.3, 5.1, 
5.1, 5, 5, 4.9, 4.5, 6, 5.9, 5.7, 5.4, 5.3, 5.1, 5.6, 5.4, 5.3, 
5.6, 4.6, 4.2, 4.5, 4.2, 4, 3.8, 6, 5.8, 5.7, 5.6, 5.3, 5.6, 
5.4, 5.5, 5.4, 5.1, 9, 8.8, 8.6, 8.4, 8.2, 8, 7.8, 7.6, 7.4, 
7.2, 6, 5.75, 5.5, 5.25, 5, 4.75, 10, 8.9, 7.8, 6.7, 5.6, 4.5, 
3.4, 2.3, 1.2, 0.1, 6, 5.8, 5.7, 5.6, 5.5, 5.5, 5.4, 5.6, 5.8, 
5.1, 6, 5.5, 5.4, 5.3, 5.2, 5.1), decile = c(1L, 2L, 3L, 4L, 
5L, 6L, 7L, 8L, 9L, 10L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 
10L, 1L, 2L, 3L, 4L, 5L, 6L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 
9L, 10L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 1L, 2L, 3L, 
4L, 5L, 6L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 1L, 2L, 
3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 1L, 2L, 3L, 4L, 5L, 6L), time = c(2016L, 
2016L, 2016L, 2016L, 2016L, 2016L, 2016L, 2016L, 2016L, 2016L, 
2016L, 2016L, 2016L, 2016L, 2016L, 2016L, 2016L, 2016L, 2016L, 
2016L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 
2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 
2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 
2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2018L, 2018L, 2018L, 
2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 
2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 
2018L, 2018L, 2018L, 2018L, 2018L)), .Names = c("name", "amount", 
"decile", "time"), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, 
-78L), spec = structure(list(cols = structure(list(name = structure(list(), class = c("collector_character", 
"collector")), amount = structure(list(), class = c("collector_double", 
"collector")), decile = structure(list(), class = c("collector_integer", 
"collector")), time = structure(list(), class = c("collector_integer", 
"collector"))), .Names = c("name", "amount", "decile", "time"
)), default = structure(list(), class = c("collector_guess", 
"collector"))), .Names = c("cols", "default"), class = "col_spec"))

В конечном итоге я хочу создать график ggplot, который детализирует среднее «количество» для каждого года по квинтилям (то есть 5 маленьких гистограмм для каждого года данных).

Чтобы достичь этого, мне нужно уметь вычислять квинтили (усредняя все значения в децилях 1 и 2, 3 и 4, 5 и 6, 7 и 8 и 9 и 10, а также включая 95%CI также.

В прошлом я пытался отфильтровать свои данные, но я изо всех сил пытаюсь осмыслить это с помощью операторов if.

Буду признателен за любую помощь.

Ответы [ 2 ]

0 голосов
/ 28 ноября 2018

Если вы просто ищете средние значения, попробуйте это:

library(tidyverse)

df1 %>% 
  mutate(quintile = floor((decile - 1) / 2) + 1) %>% 
  group_by(time, quintile) %>% 
  summarise(AvgAmount = mean(amount)) %>% 
  ggplot(aes(quintile, AvgAmount)) + 
  geom_bar(stat = "identity") + 
  facet_grid(time ~ .)

my plot

Если вы хотите лучше понять распределениев пределах квинтилей мы могли бы использовать коробочный график:

df1 %>% 
  mutate(quintile = floor((decile - 1) / 2) + 1) %>% 
  ggplot(aes(quintile, amount, group = quintile)) + 
  geom_boxplot() + 
  facet_grid(time ~ .)

box plot

0 голосов
/ 28 ноября 2018

Вы можете сделать это с помощью функций dplyr, используя канал, преобразуя дециль в квинтиль, разделив на 2 и округлив.Здесь я только что сделал очень быстрый и грязный доверительный интервал, равный 2-кратному стандартному отклонению, но вам может понадобиться какой-то другой метод..

ggplot(plot_data, aes(x = quintile, y = average_amount)) + 
  geom_col() + 
  geom_errorbar(aes(ymin = ci_min, ymax = ci_max)) +
  facet_wrap(~ time)

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...