r - Rolling Sum Dplyr
问题描述
如果我有一个数据框,并且我想使用滚动求和来对前 n 行和后 n 行求和,那么最好的方法是什么?我知道roll_sum,但我找不到一种方法来使用它来适应我的用例。例如,假设我有一个向量 n。我指定我希望我的窗口为 1,这意味着对于每条记录,我想将它和两个相邻的记录相加。
n window1
1 NA
3 8
4 12
5 15
6 18
7 22
9 17
1 15
5 6
如果我指定 2 作为我的窗口大小,那么这将是结果:
n window1 window2
1 NA NA
3 8 NA
4 12 19
5 15 25
6 18 31
7 22 28
9 17 28
1 15 22
5 6 15
是否有捷径可寻?
解决方案
可能有专用功能,但这似乎有效。它使您可以控制您希望它的行为方式。例如,default = 0
in the lead 函数允许它转到最后一条记录,即使没有前导值。我敢打赌,这是相对缓慢和低效的。
library(dplyr)
library(purrr)
rolling_sum <- function(v, window = 1) {
k <- 1:window
vLag <- k %>%
map_dfc(~lag(v, .))
vLead <- k %>%
map_dfc(~lead(v, ., default = 0))
rowSums(bind_cols(vLag, V = v, vLead))
}
df <- data.frame(n = c(1,3,4,5,6,7,9,1,5))
df %>%
mutate(window1 = rolling_sum(n, 1),
window2 = rolling_sum(n, 2))
推荐阅读
- css - visjs timeline change CSS on top
- reactjs - 无法在 React Navite 元素按钮中将值作为函数传递
- node.js - How pg-promise handles multiple clients in the same app
- powershell - Compare dates from a string in PowerShell
- c++ - 捕获到 SYCL 异常:错误:[ComputeCpp:RT0101] 无法创建内核((内核名称:SYCL_class_multiply))
- sql-server - 如何使用 Docker 和 Docker Compose 从备份开始自动创建和运行“干净”的 SQL Server 数据库?
- java - 在 Ubuntu 中通过 Java 执行 bash 命令
- javascript - 在 React 组件状态下修改数组中特定项目的最舒适/传统方法是什么?
- websocket - 基于 geohashes 的 pubsub 主题划分的建议,以实现巧妙的 websocket 连接服务
- git - 如何在 Gogs Server 中定义拉取请求模板