【发布时间】:2019-09-24 10:14:19
【问题描述】:
从以下开始:
library(tidyverse)
library(lubridate)
df <- tibble(
date = seq.Date(ymd("2018-01-01"), by = "month", length.out = 6),
y = c(20, 10, 15, 35, 40, 50)
)
df
#> # A tibble: 6 x 2
#> date y
#> <date> <dbl>
#> 1 2018-01-01 20
#> 2 2018-02-01 10
#> 3 2018-03-01 15
#> 4 2018-04-01 35
#> 5 2018-05-01 40
#> 6 2018-06-01 50
我想创建一个新列z,它是一个递归滚动 6 周期平均值。也就是说,对于2018-07-01,这只是最后六个记录的平均值,但对于2018-08-01 forward,我们在新的滚动计算中使用(相关的)先前计算的滚动平均值。
我用tibbletime::rollify 和zoo::rollmeanr 尝试了一些东西,但都不允许我递归引用最后计算的滚动平均值。
所需的输出:
desired_df <- tibble(
date = seq.Date(ymd("2018-01-01"), by = "month", length.out = 22),
y = c(20, 10, 15, 35, 40, 50, rep(NA, 16)),
z = c(
rep(NA, 6),
28.3333, 29.7222, 33.0093, 36.0108, 36.1793, 35.5425, 33.1329,
33.9328, 34.6346, 34.9055, 34.7213, 34.4783, 34.3009, 34.4955,
34.5893, 34.5818
)
)
desired_df
#> # A tibble: 22 x 3
#> date y z
#> <date> <dbl> <dbl>
#> 1 2018-01-01 20 NA
#> 2 2018-02-01 10 NA
#> 3 2018-03-01 15 NA
#> 4 2018-04-01 35 NA
#> 5 2018-05-01 40 NA
#> 6 2018-06-01 50 NA
#> 7 2018-07-01 NA 28.3
#> 8 2018-08-01 NA 29.7
#> 9 2018-09-01 NA 33.0
#> 10 2018-10-01 NA 36.0
#> # ... with 12 more rows
【问题讨论】:
-
这里的 for 循环有什么问题?
-
@duckmayr 它可以工作,但这是一个更大的分析的一部分,其中循环的长度可能无法在没有大量努力的情况下预先确定,但请随时发布你的解决方案。
-
这实际上也引出了一个问题:这里的停止规则是什么?您从 6 行
df开始,以 22 行desired_df结束。为什么是 22 岁,而不是 50 岁? -
@duckmayr 有多个停止标准,但为了使这个问题易于管理,我们可以假设 22 个可以涵盖大部分用例。
标签: r dplyr rolling-computation