You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按账户分组计算滚动加权和?(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)

关键修改说明

  1. 排序是前提:先通过arrange(account, timestamp)把每个账户的交易按时间从小到大排序,否则滚动窗口会因为时间乱序计算错误。
  2. 分组执行:用group_by(account)告诉dplyr后续的mutate操作要在每个账户的子数据集上单独运行。
  3. 调整rollapplyr的输入:在mutate里调用rollapplyr时,传入的是当前分组的timestamp、value和weight列,这样每个账户的窗口只会包含自己的交易记录。

验证结果

你可以通过筛选单个账户的数据,检查weighted_sum的计算是否仅基于该账户过去12小时的交易:

# 查看账户A的计算结果
df %>% filter(account == "A") %>% arrange(timestamp)

内容的提问来源于stack exchange,提问作者Bobby

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:24:07