计算数据帧中每5年的平均值



下面是我的数据的一些示例。我想计算每5年数据框架中每列的平均值。

data=data.frame(date=c('01-01-2011', '04-05-2011',
'02-09-2021', '11-11-2011'),
va1=c(34,56,78,32),va2=c(34,56,78,32))

例如,如果日期为1990年1月1日。。。。。。01-01-2010,按5年计算平均值

1995年1月1日(前5年(

01-01-2000(前5年(

01-01-2005(前5年(

01-01-2010(前5年(

我不清楚你所说的5年是什么意思,所以我们假设你希望5年在当前行的日期结束。请注意,问题中示例数据日期的格式不明确。

使用read.zoo转换为动物园系列。这也会将日期转换为指定格式的Date类,并对数据进行排序。然后将宽度(每行平均的行数(计算为w并运行rollapplyr。如果您需要数据帧,请使用fortify.zoo(zz)

library(zoo)
z <- read.zoo(data, format = "%m-%d-%Y")
tt <- time(z)
w <- seq_along(tt) - findInterval(tt - 5 * 365.25, tt)
zz <- cbind(z, mean5yr = rollapplyr(z, w, mean)); zz

给予:

va1.z va2.z va1.mean5yr va2.mean5yr
2011-01-01    34    34    34.00000    34.00000
2011-04-05    56    56    45.00000    45.00000
2011-11-11    32    32    40.66667    40.66667
2021-02-09    78    78    78.00000    78.00000

已添加

根据您的需求,这里有一些变化。CCD_ 5是所有人都需要的。

z <- read.zoo(data, FUN = as.yearmon, format = "%m-%d-%Y")
tt <- time(z); w <- seq_along(tt) - findInterval(tt - 5, tt)
zz <- cbind(z, mean5yr = rollapplyr(z, w, mean)); zz
##          va1.z va2.z va1.mean5yr va2.mean5yr
## Jan 2011    34    34    34.00000    34.00000
## Apr 2011    56    56    45.00000    45.00000
## Nov 2011    32    32    40.66667    40.66667
## Feb 2021    78    78    78.00000    78.00000

或者基于将时间范围划分为不重叠的5年部分,这里有一些变化。

z <- read.zoo(data, format = "%m-%d-%Y")
tt <- as.integer(as.yearmon(as.Date(cut(time(z), "5 years"))))
aggregate(z, tt, mean)
##           va1      va2
## 2011 40.66667 40.66667
## 2021 78.00000 78.00000
z <- read.zoo(data, format = "%m-%d-%Y")
bins <- c(-Inf, 2010, 2015, 2020, Inf)  # custom bins
tt <- cut(as.integer(as.yearmon(time(z))), bins, right = FALSE)
aggregate(z, tt, mean)
##                  va1      va2
## [2010,2015) 40.66667 40.66667
## [2020, Inf) 78.00000 78.00000
z <- read.zoo(data, format = "%m-%d-%Y")
tt <- 5 * (ceiling(as.yearmon(time(z))) %/% 5) # first yr
aggregate(z, tt, mean)
##           va1      va2
## 2010 40.66667 40.66667
## 2020 78.00000 78.00000
z <- read.zoo(data, format = "%m-%d-%Y")
tt <- as.integer(5 * ceiling(as.yearmon(time(z)) / 5)) # last yr
aggregate(z, tt, mean)
##           va1      va2
## 2015 40.66667 40.66667
## 2025 78.00000 78.00000

解决方案可以是:

periods <- seq(as.Date("1990-01-01"),as.Date("2030-01-01"), by= "5 years")
groups <- cut(as.Date(data$date, "%m-%d-%Y"), breaks = periods, labels = periods[-1]) 
average_by_5yr <- aggregate(data[,c("va1","va2")], by=list(period=groups), mean)
average_by_5yr

当然,如果我没有错的话,你可以提前知道开始和结束的时间,我可以从这个问题中推断出来。

编辑另请参阅片段as.Date(data$date, "%m-%d-%Y")。我无法从你的例子中猜出日期是mdy格式还是dmy格式。我假设是第一个。

最新更新