滚动总和
Rolling Sum Dplyr
如果我有一个数据框并且我想使用滚动求和来对前 n 行和后 n 行求和,最好的方法是什么?我知道 roll_sum,但找不到适合我的用例的方法。例如,假设我有一个向量 n。我指定我希望我的 window 为 1,这意味着我想对每条记录和两个相邻记录求和。
n window1
1 NA
3 8
4 12
5 15
6 18
7 22
9 17
1 15
5 6
如果我指定 2 作为我的 window 大小,那么结果将是:
n window1 window2
1 NA NA
3 8 NA
4 12 19
5 15 25
6 18 31
7 22 28
9 17 28
1 15 22
5 6 15
有没有简单的方法来做到这一点?
可能有专门的功能,但这似乎可行。它使您可以控制您希望它的行为方式。例如,lead 函数中的 default = 0
允许它转到最后一条记录,即使没有前导值。我敢打赌,这相对较慢且效率低下。
library(dplyr)
library(purrr)
rolling_sum <- function(v, window = 1) {
k <- 1:window
vLag <- k %>%
map_dfc(~lag(v, .))
vLead <- k %>%
map_dfc(~lead(v, ., default = 0))
rowSums(bind_cols(vLag, V = v, vLead))
}
df <- data.frame(n = c(1,3,4,5,6,7,9,1,5))
df %>%
mutate(window1 = rolling_sum(n, 1),
window2 = rolling_sum(n, 2))
我认为 zoo 包中的 rollapplyr 是你的朋友。使用 align = ‘center’,您可以对前 n 行和后 n 行求和。
如果我有一个数据框并且我想使用滚动求和来对前 n 行和后 n 行求和,最好的方法是什么?我知道 roll_sum,但找不到适合我的用例的方法。例如,假设我有一个向量 n。我指定我希望我的 window 为 1,这意味着我想对每条记录和两个相邻记录求和。
n window1
1 NA
3 8
4 12
5 15
6 18
7 22
9 17
1 15
5 6
如果我指定 2 作为我的 window 大小,那么结果将是:
n window1 window2
1 NA NA
3 8 NA
4 12 19
5 15 25
6 18 31
7 22 28
9 17 28
1 15 22
5 6 15
有没有简单的方法来做到这一点?
可能有专门的功能,但这似乎可行。它使您可以控制您希望它的行为方式。例如,lead 函数中的 default = 0
允许它转到最后一条记录,即使没有前导值。我敢打赌,这相对较慢且效率低下。
library(dplyr)
library(purrr)
rolling_sum <- function(v, window = 1) {
k <- 1:window
vLag <- k %>%
map_dfc(~lag(v, .))
vLead <- k %>%
map_dfc(~lead(v, ., default = 0))
rowSums(bind_cols(vLag, V = v, vLead))
}
df <- data.frame(n = c(1,3,4,5,6,7,9,1,5))
df %>%
mutate(window1 = rolling_sum(n, 1),
window2 = rolling_sum(n, 2))
我认为 zoo 包中的 rollapplyr 是你的朋友。使用 align = ‘center’,您可以对前 n 行和后 n 行求和。