R,时间序列,平均值,序列
R, time series, average, sequence
大家好,我有一个 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
有人可以帮我吗?
如果您的日期确实是每天,即每年 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)))
第一行使用基于正则表达式的逻辑向量来删除从五月到十月的月份。第二行使用正则表达式 return 一个逻辑向量,指示观察是否是十一月一日。我使用 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))
大家好,我有一个 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
有人可以帮我吗?
如果您的日期确实是每天,即每年 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)))
第一行使用基于正则表达式的逻辑向量来删除从五月到十月的月份。第二行使用正则表达式 return 一个逻辑向量,指示观察是否是十一月一日。我使用 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))