2014-01-07 144 views
2

我发现这很难处理。我有一个R时间序列数据框,包含大约50年数据每天的值。我想计算每个月只有最后5个值的平均值。如果每个月在同一天结束,那么这很简单,在这种情况下,我可以只是子集。然而,大家都知道有些月份会在31点结束,30点钟结束,然后我们会有闰年。那么,有没有一种简单的方法可以在R中做到这一点,而无需编写复杂的索引函数来考虑包括闰年在内的所有可能性?也许一个对动物园类型对象有效的函数?数据帧如下:R中每月最后5天的平均值计算

 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 
+1

见http://stackoverflow.com/questions/8333838/how-do-you-generate-a-sequence-of-the-last-day-of-the-month-over-two-years-in- r –

回答

3

tapply试试这个地方dd是您的数据帧,我们已经假定Date列是"Date"类的。 (如果dd已经排序的,因为它似乎它可能在接下来的问题,我们可以通过更换function(x) mean(head(x, 5))匿名函数缩短有点下降的Date顺序。)

> 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 

修订。做了一些更正。

+0

非常感谢,这工作得很好,看起来像tapply做了很多我在后台尝试做的分组/聚合。我也不知道应用程序可以将自定义函数作为输入。 – user2238328