下面是我的数据的一些示例。我想计算每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格式。我假设是第一个。