【问题标题】:compute mean of last 5 days of each month in R计算 R 中每个月最后 5 天的平均值
【发布时间】:2014-01-24 15:55:36
【问题描述】:

我发现这很棘手。我有一个 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

【问题讨论】:

标签: r date dataframe zoo mean


【解决方案1】:

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" 类。 (在 zoo 的情况下,dd 是否排序无关紧要,因为 zoo 会自动对其进行排序。

> library(zoo)
> z <- read.zoo(dd)
> aggregate(z, as.yearmon, function(x) mean(tail(x, 5)))
Dec 2013 Jan 2014 
2.492000 1.403333 

修订。做了一些更正。

【讨论】:

  • 非常感谢,这很好用,看起来tapply 完成了我试图在后台进行的大部分分组/聚合。我也不知道 apply 可以将自定义函数作为输入。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-14
相关资源
最近更新 更多