嘿伙计们,我有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
有人能帮助我吗?
答案 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))