如何按账户分组计算滚动加权和?(R语言代码场景)
解决方案:按账户分组计算滚动加权和
要实现按每个账户单独计算过去12小时的交易加权和,你只需要结合dplyr的分组功能和zoo的rollapplyr即可。核心思路是先按账户分组,再在每个分组内执行滚动窗口计算,确保每个账户的窗口只包含自己的交易数据。
完整可运行代码
library(zoo) library(tidyverse) # 生成带账户列的示例数据 set.seed(123) randomDates <- function(n, start = "2024-01-01", end = "2024-01-03") { as.POSIXct(runif(n, as.POSIXct(start), as.POSIXct(end))) } df <- tibble( timestamp = randomDates(100), value = rnorm(100, 50, 10), weight = runif(100, 0.1, 1), account = sample(c("A", "B", "C"), 100, replace = TRUE) # 添加账户列 ) # 关键修改:按账户分组计算滚动加权和 df <- df %>% arrange(account, timestamp) %>% # 必须先排序:按账户+时间递增,保证窗口逻辑正确 group_by(account) %>% # 按账户分组 mutate( weighted_sum = rollapplyr( .data = tibble(timestamp, value, weight), # 传入当前分组的目标列 width = function(x) which(x$timestamp >= max(x$timestamp) - 3600*12), # 12小时窗口 FUN = function(y) sum(y$value * y$weight), # 计算加权和 by.column = FALSE # 因为要处理整行数据判断时间,不能按列单独处理 ) ) %>% ungroup() # 可选:取消分组,恢复为普通数据框 # 查看结果 head(df)
关键修改说明
- 排序是前提:先通过
arrange(account, timestamp)把每个账户的交易按时间从小到大排序,否则滚动窗口会因为时间乱序计算错误。 - 分组执行:用
group_by(account)告诉dplyr后续的mutate操作要在每个账户的子数据集上单独运行。 - 调整rollapplyr的输入:在
mutate里调用rollapplyr时,传入的是当前分组的timestamp、value和weight列,这样每个账户的窗口只会包含自己的交易记录。
验证结果
你可以通过筛选单个账户的数据,检查weighted_sum的计算是否仅基于该账户过去12小时的交易:
# 查看账户A的计算结果 df %>% filter(account == "A") %>% arrange(timestamp)
内容的提问来源于stack exchange,提问作者Bobby
相关产品推荐
相关产品推荐

