假设我有一个包含一系列值的数据帧,这些值被分配给两个组('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
.