首页 > 解决方案 > R中的滚动总和

问题描述

df <- data.frame(x = seq(1:10))

我要这个:

df$y <- c(1, 2, 3, 4, 5, 15, 20 , 25, 30, 35)

即每个y都是前五个x值的总和。这意味着前五个y将与x

我得到的是:

df$y1 <- c(df$x[1:4], RcppRoll::roll_sum(df$x, 5)) 

  x  y y1
  1  1  1
  2  2  2
  3  3  3
  4  4  4
  5  5 15
  6 15 20
  7 20 25
  8 25 30
  9 30 35
  10 35 40

总之,我需要,y但我只能实现y1

标签: rrollapply

解决方案


1) 增强的求和函数定义一个函数Sum,如果它接收到 6 个值,则将其前 5 个值求和,否则返回最后一个值。然后将其与partial=TRUEin一起使用rollapplyr

Sum <- function(x) if (length(x) < 6) tail(x, 1) else sum(head(x, -1))
rollapplyr(x, 6, Sum, partial = TRUE)
##  [1]  1  2  3  4  5 15 20 25 30 35

2)求和 6 并减去原始向量 另一种可能性是取 6 个元素的运行总和,用 NA 填充前 5 个元素并减去原始向量。最后填写前5个。

replace(rollsumr(x, 6, fill = NA) - x, 1:5, head(x, 5))
##  [1]  1  2  3  4  5 15 20 25 30 35

3)指定偏移量第三种可能性是使用宽度的偏移量形式来指定前5个元素:

c(head(x, 5), rollapplyr(x, list(-(1:5)), sum))
## [1]  1  2  3  4  5 15 20 25 30 35

4) 偏移量的替代规范 在这个替代方案中,我们为前 5 个元素中的每一个指定偏移量为 0,为其余元素指定偏移量 -(1:5)。

width <- replace(rep(list(-(1:5)), length(x)), 1:5, list(0))
rollapply(x, width, sum)
## [1]  1  2  3  4  5 15 20 25 30 35

笔记

填充前 5 个元素的方案似乎很不寻常,您可以考虑对前 5 个元素使用部分和,NA 或 0 作为第一个元素,因为没有先验元素:

rollapplyr(x, list(-(1:5)), sum, partial = TRUE, fill = NA)
## [1] NA  1  3  6 10 15 20 25 30 35

rollapplyr(x, list(-(1:5)), sum, partial = TRUE, fill = 0)
## [1]  0  1  3  6 10 15 20 25 30 35

rollapplyr(x, 6, sum, partial = TRUE) - x
## [1]  0  1  3  6 10 15 20 25 30 35

推荐阅读