r-如何使用dplyr获取最后一行之前最后n行的cummean



如果我有一个使用dplyr处理的数据帧,我如何获得最后一行之前的最后两行的cummean?

例如。。。

------
|value|
-------
| 1   |
------
| 2   |
-------
| 3   |
------
| 4   |
-------

在这种情况下,当代码通过值4时,我希望cummean计算(2+3)/2。

我在想一些类似的事情——

new_df -> df %>%
summarise(
roll_mean = cummean(value,-2)
)

但是我知道这不起作用

[使用此数据:df <- data.frame(value = 1:4)]

对于之前的两个值,您可以手动执行如下操作:

df %>% 
mutate(roll_mean = (lag(value) + lag(value,2))/2)
#  value roll_mean
#1     1        NA
#2     2        NA
#3     3       1.5
#4     4       2.5

或者,如果窗口可能更大,则可以更容易地使用slider:slide_*,这是一组很好的窗口函数。在这里,我们要求一个窗口的平均值,该窗口在两个元素之前(.before = 2)开始,在一个元素之前结束(after = -1)。

df %>%
mutate(roll_mean = slider::slide_dbl(value, mean, .before = 2, .after = -1))
#  value roll_mean
#1     1       NaN
#2     2       1.0
#3     3       1.5
#4     4       2.5

默认情况下,slider允许不完整的窗口;如果我们想要相同的输出,我们可以使用:

df %>%
mutate(roll_mean = slider::slide_dbl(value, mean, .before = 2, .after = -1, .complete = TRUE))
#  value roll_mean
#1     1        NA
#2     2        NA
#3     3       1.5
#4     4       2.5

假设您的意思是在每个位置计算value的前两个元素的平均值,则使用宽度为list(-seq(2))rollapply,这意味着在每个点使用偏移量-1和-2,即提前一个和两个位置。将2替换为n,以获得主题中提到的先前n个值的平均值。

library(dplyr, exclude = c("filter", "lag"))
library(zoo)
DF %>% mutate(mean = rollapply(value, list(-seq(2)), mean, fill = NA))
##   value mean
## 1     1   NA
## 2     2   NA
## 3     3  1.5
## 4     4  2.5

一种变体如下。将3替换为n+1,以获得主题中提到的先前n个值的平均值。

DF %>% mutate(mean = (rollsumr(value, 3, fill = NA) - value) / 2)

备注

可复制形式的输入:

DF <- data.frame(value = 1:4)

最新更新