r - 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
解决方案
1) 增强的求和函数定义一个函数Sum
,如果它接收到 6 个值,则将其前 5 个值求和,否则返回最后一个值。然后将其与partial=TRUE
in一起使用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
推荐阅读
- javascript - 循环遍历字符串并动态插入属性 vanilla js
- entity-framework - 使用实体框架插入一到一或零时缺少 ID
- odata - 在 UI5 OData v4 模型中创建 NavigationProperty
- html - 教程第 3 部分的 Django NoReverseMatch 错误
- async-await - 使用 Mock 框架的 Xunit 中的 Assert.IsType<> 失败
- go - SetWriteDeadline 错误解读
- java - 使用 Spring Boot 和 Hibernate 的多租户和中央数据库
- azure - 使用增量 id 作为水印来复制 azure 数据工厂管道中的数据,而不是日期时间
- javascript - 在 View 中初始化一个高位图表
- java - IBM MQ 失败,原因为“2278”(“MQRC_CLIENT_CONN_ERROR”)