我在数据框下方,想要计算组的平均值并替换组的最新日期
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)
答案 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