Как рассчитать среднее значение по группам и заменить дату во фрейме данных R - PullRequest
0 голосов
/ 12 ноября 2018

У меня ниже фрейма данных и хочу рассчитать среднее значение групп и заменить самую последнюю дату группы

df <- data.frame(group=c(1,1,1,2,2,2,3,3,3),
                 date=c("2014-02-13","2014-02-14","2014-02-15","2017-08-21","2017-08-22","2017-08-23","2012-06-11","2012-06-12","2012-06-13"),
                 value=c(5,2,1,4,8,6,7,9,3))

df$date <- as.Date(df$date,format='%Y-%m-%d')



    group       date value
1     1 2014-02-13     5
2     1 2014-02-14     2
3     1 2014-02-15     1
4     2 2017-08-21     4
5     2 2017-08-22     8
6     2 2017-08-23     6
7     3 2012-06-11     7
8     3 2012-06-12     9
9     3 2012-06-13     3

Я ищу вывод, который удалит столбец группы и заменит самую последнюю дату группы в столбце даты и вычислит среднее значение для трех групп, т.е. окончательный результат должен быть таким, как показано ниже, где сохраняются только самые последние даты группы в столбце даты и среднее значение трех групп заменяются в столбце значений. У меня более 3 групп и более 3 дат в моих фактических данных. Может ли кто-нибудь помочь в поиске решения.

       date        value
1      2017-08-21  5.33 (Average of 5+4+7)
2      2017-08-22  6.33 (Average of 2+8+9)
3      2017-08-23  3.33 (Average of 1+6+3)

1 Ответ

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

Вы можете использовать dplyr для достижения этой цели:

library(dplyr)

df %>% 
  group_by(group) %>% 
  arrange(date) %>% 
  mutate(ind = 1:n()) %>% 
  group_by(ind) %>% 
  mutate(date = max(date)) %>%
  group_by(date) %>% 
  summarise(value = mean(value))

# A tibble: 3 x 2
#   date       value
#   <date>     <dbl>
# 1 2017-08-21  5.33
# 2 2017-08-22  6.33
# 3 2017-08-23  3.33

Пошаговая инструкция и объяснение

Решение станет немного понятнее, если мы посмотрим, что сделано шаг за шагом:
Сначала я группирую данные по группам, располагаю их по дате и добавляю столбец индикатора, который сообщает мне, какая дата самая последняя.

df1 <- df %>% 
  group_by(group) %>% 
  arrange(date) %>% 
  mutate(ind = 1:n())

df1
# A tibble: 9 x 4
# Groups:   group [3]
#   group date       value   ind
#   <dbl> <date>     <dbl> <int>
# 1     3 2012-06-11     7     1
# 2     3 2012-06-12     9     2
# 3     3 2012-06-13     3     3
# 4     1 2014-02-13     5     1
# 5     1 2014-02-14     2     2
# 6     1 2014-02-15     1     3
# 7     2 2017-08-21     4     1
# 8     2 2017-08-22     8     2
# 9     2 2017-08-23     6     3

Затем я изменяю группировку на этот индикатор и устанавливаю дату на максимальную дату.

df2 <- df1 %>% 
  group_by(ind) %>% 
  mutate(date = max(date)) 

df2
# A tibble: 9 x 4
# Groups:   ind [3]
#   group date       value   ind
#   <dbl> <date>     <dbl> <int>
# 1     3 2017-08-21     7     1
# 2     3 2017-08-22     9     2
# 3     3 2017-08-23     3     3
# 4     1 2017-08-21     5     1
# 5     1 2017-08-22     2     2
# 6     1 2017-08-23     1     3
# 7     2 2017-08-21     4     1
# 8     2 2017-08-22     8     2
# 9     2 2017-08-23     6     3

Наконец, я группирую по дате и суммирую значения, вычисляя среднее значение.

df2 %>%
  group_by(date) %>% 
  summarise(value = mean(value))


# A tibble: 3 x 2
#   date       value
#   <date>     <dbl>
# 1 2017-08-21  5.33
# 2 2017-08-22  6.33
# 3 2017-08-23  3.33
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...