首页 > 解决方案 > data.frame 中一个变量的滚动总和,以另一个变量定义的步数计算

问题描述

我试图以累积的方式总结 data.frame 中的值。

我有这个:

df <- data.frame(
  a = rep(1:2, each = 5),
  b = 1:10,
  step_window = c(2,3,1,2,4, 1,2,3,2,1)
)

我试图b在组内总结 , 的值a。诀窍是,我想要与b当前行后面的行数对应的值的总和,由step_window.

这是我正在寻找的输出:

data.frame(
    a = rep(1:2, each = 5),
    step_window = c(2,3,1,2,4, 
                    1,2,3,2,1),
    b = 1:10,
    sum_b_step_window = c(3, 9, 3, 9, 5,
                          6, 15, 27, 19, 10)
  ) 

我尝试使用 来执行此操作,RcppRoll但出现错误Expecting a single value

df %>% 
  group_by(a) %>% 
  mutate(sum_b_step_window = RcppRoll::roll_sum(x = b, n = step_window))

标签: rdplyrrolling-computation

解决方案


我不确定在任何滚动功能中是否可以使用可变窗口大小。这是使用以下方法执行此操作的一种方法map2_dbl

library(dplyr)
df %>% 
  group_by(a) %>% 
  mutate(sum_b_step_window = purrr::map2_dbl(row_number(), step_window, 
                             ~sum(b[.x:(.x + .y - 1)], na.rm = TRUE)))

#      a     b step_window sum_b_step_window
#   <int> <int>       <dbl>             <dbl>
# 1     1     1           2                 3
# 2     1     2           3                 9
# 3     1     3           1                 3
# 4     1     4           2                 9
# 5     1     5           4                 5
# 6     2     6           1                 6
# 7     2     7           2                15
# 8     2     8           3                27
# 9     2     9           2                19
#10     2    10           1                10

推荐阅读