如何按组计算平均值并替换R数据框中的日期

How to calculate average value by group and replace date in R data frame

我有以下数据框,想计算组的平均值并替换组的最新日期

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)

您可以使用 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