dplyr:求前n个值的和

3

我有一些这样的数据:

data <- tibble(a = 1:100)

a
--
1
2
3
4
5
6
7
...

有没有一种优雅的方式来创建一个变量,它将是前n个值的总和?我的意思是像这样的东西:

data %>% mutate(b = lead(a,1) + lead(a,2) + lead(a,3) + ... + lead(a,n))

例如,当n = 2时,我会得到以下结果:
a      b
--------------
1    2+3 = 5
2    3+4 = 7
3    4+5 = 9
4    5+6 = 11
5    6+7 = 13
6    7+8 = 15
7    8+9 = 17
...

提前感谢你!

3个回答

3
使用快速函数生成所有引导向量并将它们相加:
lead_n = function(x, n = 1) {
    leads = lapply(1:n, function(i) lead(x, i))
    Reduce(`+`, leads)
}
data %>%
    mutate(b = lead_n(a, 2))

输出:

      a     b
   <int> <int>
 1     1     5
 2     2     7
 3     3     9
 4     4    11
 5     5    13
 6     6    15
 7     7    17
 8     8    19
 9     9    21
10    10    23

3
我们已经接近重新创建被遮蔽的函数了。
stats::filter(1:10, c(rep(1,2),0), sides=1)
#Time Series:
#Start = 1 
#End = 10 
#Frequency = 1 
# [1] NA NA  5  7  9 11 13 15 17 19

这里有一个小函数,可以精确匹配输出:
sumnahead <- function(x,n) {
  rev(stats::filter(rev(x), c(0,rep(1,n)), sides=1))
}

sumnahead(1:10,2)
#[1]  5  7  9 11 13 15 17 19 NA NA

它也很快,因为它利用编译代码:

system.time(sumnahead(1:1e7,50))
#   user  system elapsed 
#   2.28    0.22    2.53 
system.time(lead_n(1:1e7,50))
#   user  system elapsed 
#   6.02    4.07   10.13 

1
这是一个向左对齐的滚动求和,向前偏移一个位置。使用lead函数向前偏移一个位置来排除当前值。
library(dplyr)

data <- tibble(a = 1:100)

data %>% mutate(b = lead(zoo::rollsum(a, 2, fill = NA, align = 'left')))
#> # A tibble: 100 x 2
#>        a     b
#>    <int> <int>
#>  1     1     5
#>  2     2     7
#>  3     3     9
#>  4     4    11
#>  5     5    13
#>  6     6    15
#>  7     7    17
#>  8     8    19
#>  9     9    21
#> 10    10    23
#> # ... with 90 more rows

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接