2014-01-07 143 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