R 如何对数据帧进行三个月的平均,并使用这些值构建一个新的数据帧?

R 如何对数据帧进行三个月的平均,并使用这些值构建一个新的数据帧?,r,R,我得到了一个包含降水数据的数据框(第三列)。第一列为月份(仅1月、11月和12月)。第二列是年份 我想计算11月-12月-1月这三个月的平均值。我该怎么做 例如:我想计算1961年11月、1961年12月和1962年1月的平均值,在我的新数据框中,这个数字可能是1961/62年冬季的数字。然后,我想对1962年11月、1962年12月和1963年1月做同样的事情,平均值可以是我的新数据框中1962/63年冬季的值。我想用整个数据帧来做这件事 如你所见:我没有1960年11月和1960年12月的数

我得到了一个包含降水数据的数据框(第三列)。第一列为月份(仅1月、11月和12月)。第二列是年份

我想计算11月-12月-1月这三个月的平均值。我该怎么做

例如:我想计算1961年11月、1961年12月和1962年1月的平均值,在我的新数据框中,这个数字可能是1961/62年冬季的数字。然后,我想对1962年11月、1962年12月和1963年1月做同样的事情,平均值可以是我的新数据框中1962/63年冬季的值。我想用整个数据帧来做这件事

如你所见:我没有1960年11月和1960年12月的数据,因此1960/61年冬季的值可能只有1961年1月的值

我该怎么做

使用此代码,您可以表示与我的示例中的数据帧相同的数据帧。我的数据帧将于2019年1月结束

以下是一些示例数据:

DF <- data.frame(
  a=c("January", "November", "December", "January", "November", "December", "January", "November", "December", "January"),
  b=c("1961", "1961", "1961", "1962", "1962", "1962", "1963", "1963", "1963", "1964"),
  c=c(5.3, 4, 7, 2, 4, 7, 5, 9, 2, 5)
)

DF我们可以使用
complete
来包括每年缺少的月份组合。因为我们不需要1960年的1月和1964年的11月和12月,所以我们可以删除它们。然后,我们可以每3行创建一组,并对其进行
mean

library(dplyr)
order_vec <- c('January', 'November', 'December')

DF %>%
  type.convert() %>%
  tidyr::complete(b = seq(min(b) - 1, max(b)), 
                  a = factor(order_vec, levels = order_vec)) %>%
   slice(-c(1L, n() - 1, n())) %>%
   group_by(grp = ceiling(row_number()/3)) %>%
   summarise(mean = mean(c, na.rm = TRUE))

#    grp  mean
#  <dbl> <dbl>
#1     1  5.3 
#2     2  4.33
#3     3  5.33
#4     4  5.33
库(dplyr)
订单成本%
type.convert()%>%
三年:完成(b=序号(最小值(b)-1,最大值(b)),
a=系数(顺序向量,级别=顺序向量))%>%
切片(-c(1L,n()-1,n())%>%
分组依据(grp=天花板(行编号()/3))%>%
总结(平均值=平均值(c,na.rm=真))
#grp平均值
#   
#1     1  5.3 
#2     2  4.33
#3     3  5.33
#4     4  5.33

好的,我确实找到了解决方案

我用了这句台词,效果很好! 请注意,我删除了第一行,只是因为我不想使用该值。 运行此代码后,我得到了11月、12月和1月的平均值,这是我想要计算的值。 如您所见,n=3(但适用于计算平均值所需的任意行数)


DF[-1,]nIt如果您包含一个简单的示例输入和所需的输出,可以用来测试和验证可能的解决方案,那么它将更容易帮助您。请不要将数据作为图像共享--我们无法将其复制/粘贴到R中进行测试。
library(dplyr)
order_vec <- c('January', 'November', 'December')

DF %>%
  type.convert() %>%
  tidyr::complete(b = seq(min(b) - 1, max(b)), 
                  a = factor(order_vec, levels = order_vec)) %>%
   slice(-c(1L, n() - 1, n())) %>%
   group_by(grp = ceiling(row_number()/3)) %>%
   summarise(mean = mean(c, na.rm = TRUE))

#    grp  mean
#  <dbl> <dbl>
#1     1  5.3 
#2     2  4.33
#3     3  5.33
#4     4  5.33
DF[-1,] n<- 3; aggregate(DF,list(rep(1:(nrow(DF)%/%n+1),each=n,len=nrow(DF))),mean)[-1]