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

在R中基于30天窗口为企业交易分组并编号的实现咨询

企业交易30天窗口编号优化方案

需求说明

现有包含交易日期与企业ID的数据集,需为每个企业的交易按以下规则分配窗口编号:

  • 窗口从该企业首个交易日期开始,持续30天
  • 当后续交易超出当前窗口时,以该交易日期作为新窗口起始,重新从1开始编号
    示例数据中的instance列为期望结果。

初始代码

用户已完成按ID分组并按行号编号的基础逻辑,代码如下:

library(tidyverse)
id<-c("1","1","1","1","1","1", "2","2","2")
date<-as.Date(c("2023-01-04","2023-01-15","2023-02-01","2023-02-15","2023-03-15", "2023-04-01", "2023-01-01", "2023-04-01","2023-05-03"))
instance<-c(1,2,3,1,2,1,1,1,1)
df<-data.frame(id, date, instance)

df2<-df%>%
  group_by(id)%>%
  mutate(instance2=row_number())

优化方案

通过计算每个交易对应的窗口起始点,再基于起始点分组编号,可实现需求逻辑:

library(tidyverse)

# 复用原数据
id<-c("1","1","1","1","1","1", "2","2","2")
date<-as.Date(c("2023-01-04","2023-01-15","2023-02-01","2023-02-15","2023-03-15", "2023-04-01", "2023-01-01", "2023-04-01","2023-05-03"))
instance<-c(1,2,3,1,2,1,1,1,1)
df<-data.frame(id, date, instance)

# 核心逻辑实现
df_optimized <- df %>%
  group_by(id) %>%
  arrange(date, .by_group = TRUE) %>%
  # 迭代计算窗口起始点:当前日期超出上一窗口30天则更新起始,否则沿用
  mutate(window_start = accumulate(date, ~ ifelse(.y > .x + 30, .y, .x))) %>%
  # 按窗口起始点分组,给每个窗口内的交易编号
  group_by(id, window_start) %>%
  mutate(instance_optimized = row_number()) %>%
  ungroup(window_start) %>%
  ungroup()

逻辑解释

  1. 排序:按企业ID分组后,对每组内的交易日期排序,确保时间顺序正确
  2. 窗口起始计算:用accumulate函数逐行判断,若当前日期超出上一个窗口起始+30天的范围,就将当前日期设为新窗口起始,否则保留原起始
  3. 窗口内编号:以企业ID和窗口起始点为二级分组,对每个窗口内的交易按顺序分配行号,实现每个窗口从1开始编号的要求

验证结果:instance_optimized列将与示例中的instance列完全匹配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 00:47:35