R中的滚动总和
Rolling sum in 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
一个简单的方法是:
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
1) 增强求和函数 定义一个函数Sum
如果它接收到 6 个值则对它的前 5 个值求和,否则 returns 最后一个值。然后在 rollapplyr
:
中与 partial=TRUE
一起使用
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) sum 6 and subtract off original 另一种可能是运行 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) 指定偏移 第三种可能是使用width的偏移形式指定前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
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)
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
一个简单的方法是:
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
1) 增强求和函数 定义一个函数Sum
如果它接收到 6 个值则对它的前 5 个值求和,否则 returns 最后一个值。然后在 rollapplyr
:
partial=TRUE
一起使用
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) sum 6 and subtract off original 另一种可能是运行 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) 指定偏移 第三种可能是使用width的偏移形式指定前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
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)