R中的滚动总和

时间:2018-08-22 14:52:00

标签: r rollapply

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

我想要这个:

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

即每个y是前五个x值的总和。这意味着第一个 五个yx

我得到的是这样:

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

3 个答案:

答案 0 :(得分:4)

1)增强的求和函数定义一个函数Sum,如果它收到6个值,则将其前5个值相加,否则返回最后一个值。然后将其与partial=TRUE中的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

答案 1 :(得分:0)

一种简单的方法是:

df <- data.frame(x = seq(1:10))
mysum <- function(x, k = 5) {
  res <- rep(NA, length(x))
  for (i in seq_along(x)) {
    if (i <= k) { # edited ;-)
      res[i] <- x[i]
    } else {
      res[i] <- sum(x[(i-k):(i-1)])
    }
  }
  res
}
mysum(df$x)
# [1]  1  2  3  4  5 15 20 25 30 35

答案 2 :(得分:0)

mysum <- function(x, k = 5) {
  res <- x[1:k]
  append<-sapply(2:(len(x)+1-k),function(i) sum(x[i:(i+k-1)]))
  return(c(res,append))
}
mysum(df$x)