r语言 - 如何计算前n个值的滚动平均值



假设我有一个包含一系列值的数据帧,这些值被分配给两个组('Gp')之一:

set.seed(12)
df <- data.frame(id = sample(1:50,50), Gp = sample(2, 50, TRUE)) 

以下是其中的前20个值:

df
row  id Gp
1   4  1
2  41  1
3  46  1
4  13  1
5   8  2
6   2  2
7  48  2
8  28  2
9   1  2
10 42  2
11 16  2
12 32  1
13 15  2
14 38  2
15 10  1
16 40  1
17 35  1
18 18  2
19 22  1
20 50  2

我想做的是取当前行前10、11和12位值的滚动平均值,然后从中减去当前(行)值。我还想用NA填充,按另一列('Gp')分组,并向右对齐。

我看过一些其他的帖子,并且已经能够用dplyr减去第n个先前的值部分来做到这一点:

df2 <- df %>% group_by(Gp) %>%
mutate( rm = rollmeanr(id,k = 3, fill = NA)) %>%
ungroup

但这只是通过当前行和它之前的2行。在上面的例子中,我想做的是,例如对于第15行:

row 15 - (row 5 + row 4 + row 3)/3
= 10 - (8 + 12 + 46) / 3 = -12

我想把它放在一个新的列中,以一个新的名称附加到原来的df。如果可能的话,我也想使用dplyr。

对于本例,所需输出df的这一行是:

row id Gp rm
15 10  1 -12

我认为lag()可能会有帮助,但需要3个滞后值在一起,如果没有更清晰的代码,可以看到这会变得混乱。

相似的问题:

计算前6个n个数据点的平均值

不包括当日的其后日移动平均值

计算具有NAs r的时间序列上第n个数据点的移动平均值

您可以在使用滚动平均值之前延迟id变量:

library(dplyr)
df |> 
group_by(Gp) |>
mutate(rm = id - zoo::rollmeanr(lag(id, 10), k = 3, fill = NA)) |>
ungroup()

更新:输入错误+添加group_by.

最新更新