根据我的值,我需要一个函数来获得以下结果。 enter image description here
函数必须计算当前值的平均值和之前的3个值。 该功能应该是灵活的,相同的计算可以应用于2,4,5或x先前的值,例如:当前值的平均值和前面的2个值。
请考虑,我的日期有随机数,而不是像上面的例子中的升序数字
答案 0 :(得分:3)
您需要的是滚动均值,在参数k
(我的示例中为4)中,您提供滚动窗口的整数宽度。查看文档页面,了解动物园包的rollmean
功能?rollmean
。
<强>动物园强>
library(zoo)
library(dplyr)
df <- data.frame(number = 1:20)
df %>% mutate(rolling_avg = rollmean(number, k = 4 , fill = NA, align = "right"))
<强> RcppRoll 强>
library(RcppRoll)
df %>% mutate(rolling_avg = roll_mean(number, n = 4, fill = NA, align = "right"))
<强>输出强>
number rolling_avg
1 1 NA
2 2 NA
3 3 NA
4 4 2.5
5 5 3.5
6 6 4.5
7 7 5.5
8 8 6.5
9 9 7.5
10 10 8.5
11 11 9.5
12 12 10.5
13 13 11.5
14 14 12.5
15 15 13.5
16 16 14.5
17 17 15.5
18 18 16.5
19 19 17.5
20 20 18.5
使用评论中提供的其他矢量:
df <- data.frame(number = c(1,-3,5,4,3,2,-4,5,6,-4,3,2,3,-4,5,6,6,3,2))
df %>% mutate(rolling_avg = rollmean(number, 4, fill = NA, align = "right"))
<强>输出强>
number rolling_avg
1 1 NA
2 -3 NA
3 5 NA
4 4 1.75
5 3 2.25
6 2 3.50
7 -4 1.25
8 5 1.50
9 6 2.25
10 -4 0.75
11 3 2.50
12 2 1.75
13 3 1.00
14 -4 1.00
15 5 1.50
16 6 2.50
17 6 3.25
18 3 5.00
19 2 4.25
答案 1 :(得分:1)
您还可以使用rollify
包中的tibbletime
函数为任何函数创建自定义滚动功能。对于mean
,它看起来像这样(使用来自@ mpalanco答案的数据):
library(dplyr)
library(tibbletime)
rolling_mean <- rollify(mean, window = 4)
df %>% mutate(moving_average = rolling_mean(number))
给你:
number moving_average
1 1 NA
2 2 NA
3 3 NA
4 4 2.5
5 5 3.5
6 6 4.5
7 7 5.5
8 8 6.5
9 9 7.5
10 10 8.5
11 11 9.5
12 12 10.5
13 13 11.5
14 14 12.5
15 15 13.5
16 16 14.5
17 17 15.5
18 18 16.5
19 19 17.5
20 20 18.5
这种方法的好处是很容易扩展到滚动平均值以外的东西。