R,时间序列,平均值,序列

时间:2016-12-19 10:21:46

标签: r sequence mean zoo

嘿伙计们,我有30年的日常观察动物园对象,看起来像这样:

date        x
1971-11-01  145.234
1971-11-02  234.522
1971-11-03  423.32
1971-11-04  333.11

我想计算整个时间序列的11月到4月期间的均值。所以我想要的结果应该是这样的:

date              x
11/1971-04/1972   642.43
11/1972-04/1973   142.53
11/1973-04/1974   642.39
11/1974-04/1975   424.75
11/1975-04/1976   185.34

有人能帮助我吗?

1 个答案:

答案 0 :(得分:1)

如果您的日期确实是每天11月首次出现,那么以下策略将允许您对观察结果进行分组。

# drop observations outside of the window (May through October).
dfNew <- df[!grepl("^(0[56789]|10)", format(df$date, "%m")), ]

# build groups
dfNew$groups <- cumsum(c(TRUE, tail(grepl("11-01", format(dfNew$date, "%m-%d")), -1)))

第一行使用基于正则表达式的逻辑向量来删除5月到10月。第二行使用正则表达式返回一个逻辑向量,指示观察是否是11月的第一个。我使用tail切断了向量的第一个元素并添加了TRUE,以确保组计数以1开头。cumsum然后用于创建组指示符。

此时,您可以使用aggregate来获取组的平均值:

aggregate(x ~ groups, data=dfNew, FUN=mean)
  groups           x
1      1 -0.14947871
2      2 -0.02742739
3      3 -0.02296979
4      4  0.01939372
5      5 -0.01432937
6      6  0.10393297
7      7  0.06660049
8      8 -0.03955617
9      9 -0.06956639

数据

set.seed(1234)
df <- data.frame(date=seq(as.Date("1971-01-01"), as.Date("1979-01-01"), by="day"),
                 x=rnorm(2923))