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

时间:2018-11-12 15:57:27

标签: r date dplyr zoo

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

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 :(得分:2)

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