我发现这很棘手。我有一个R时间序列数据框,包含每天大约50年数据的值。我想计算每个月最后5个值的平均值。如果每个月在同一个31天结束,这将很简单,在这种情况下,我可以只是子集。然而,我们都知道有些月份会在31个月结束,有些会在30个月结束,然后我们会有闰年。那么,有没有一种简单的方法在R中执行此操作而无需编写复杂的索引函数来考虑包括闰年在内的所有可能性?也许是一个适用于动物园类型对象的函数?数据框如下:
Date val
1 2014-01-06 1.49
2 2014-01-03 1.38
3 2014-01-02 1.34
4 2013-12-31 1.26
5 2013-12-30 2.11
6 2013-12-26 3.20
7 2013-12-25 3.00
8 2013-12-24 2.89
9 2013-12-23 2.90
10 2013-12-22 4.5
答案 0 :(得分:3)
tapply 在dd
是您的数据框的情况下尝试此操作,我们假设Date
列属于类"Date"
。 (如果dd
已经按Date
的降序排序,因为它可能出现在问题中,那么我们可以通过用function(x) mean(head(x, 5))
替换匿名函数来缩短它。)
> tapply(dd$val, format(dd$Date, "%Y-%m"), function(x) mean(tail(sort(x), 5)))
2013-12 2014-01
2.492000 1.403333
aggregate.zoo 就动物园而言,我们可以做到这一点,它返回另一个动物园对象,其索引是类"yearmon"
。 (在动物园的情况下,dd
是否排序并不重要,因为动物园会自动对其进行排序。)
> library(zoo)
> z <- read.zoo(dd)
> aggregate(z, as.yearmon, function(x) mean(tail(x, 5)))
Dec 2013 Jan 2014
2.492000 1.403333
修订。做了一些修改。