没关系,我正在试图找出一种不同的方法。非常感谢您的回复。如何关闭此问题或标记为已解决?
答案 0 :(得分:1)
您可以使用purrr::map
计算不同(滚动)窗口的平均值。这将允许灵活地指定任意数量的(滚动)窗口。
例如:
让我们生成5年的月度数据。
# Sample data
set.seed(2018);
nObs <- 5 * 12;
dates <- seq(as.Date("2018/01/01"), by = "month", length.out = nObs);
sample.xts <- xts(x = runif(nObs), order.by = dates);
使用purrr::map
使用zoo::rollapplyr
计算不同窗口的滚动平均值。在这里,我们计算窗口c(length(sample.xts), 12, 6)
中的滚动平均值,这对应于所有观测值(5年),1年窗口和6个月窗口的平均值。
# Calculate mean in three rolling windows: 60 months (all), 12 months, 6 months
library(tidyverse);
library(zoo);
df <- purrr::map(
c(length(sample.xts), 12, 6),
~ data.frame(val = sample.xts) %>%
rownames_to_column("date") %>%
mutate(!!paste0("mean_", .x) := rollapplyr(val, .x, mean, by.column = F, fill = NA))) %>%
reduce(left_join, by = c("date", "val"))
head(df, n = 13);
# date val mean_60 mean_12 mean_6
#1 2018-01-01 0.33615347 NA NA NA
#2 2018-02-01 0.46372327 NA NA NA
#3 2018-03-01 0.06058539 NA NA NA
#4 2018-04-01 0.19743361 NA NA NA
#5 2018-05-01 0.47431419 NA NA NA
#6 2018-06-01 0.30104860 NA NA 0.3055431
#7 2018-07-01 0.60675886 NA NA 0.3506440
#8 2018-08-01 0.13001210 NA NA 0.2950255
#9 2018-09-01 0.95865471 NA NA 0.4447037
#10 2018-10-01 0.54684949 NA NA 0.5029397
#11 2018-11-01 0.39561597 NA NA 0.4898233
#12 2018-12-01 0.66453861 NA 0.4279740 0.5504050
#13 2019-01-01 0.98211229 NA 0.4818039 0.6129639
请注意,基于所有观察结果的平均值是data.frame
中的最后一个条目:
tail(df);
# date val mean_60 mean_12 mean_6
#55 2022-07-01 0.6625414 NA 0.4422977 0.4933802
#56 2022-08-01 0.9665480 NA 0.4729062 0.5254261
#57 2022-09-01 0.3932122 NA 0.4555178 0.5234418
#58 2022-10-01 0.6043476 NA 0.5056410 0.5891695
#59 2022-11-01 0.2637507 NA 0.4473775 0.6089818
#60 2022-12-01 0.4894682 0.4809708 0.4824080 0.5633114