在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()
逻辑解释
- 排序:按企业ID分组后,对每组内的交易日期排序,确保时间顺序正确
- 窗口起始计算:用
accumulate函数逐行判断,若当前日期超出上一个窗口起始+30天的范围,就将当前日期设为新窗口起始,否则保留原起始 - 窗口内编号:以企业ID和窗口起始点为二级分组,对每个窗口内的交易按顺序分配行号,实现每个窗口从1开始编号的要求
验证结果:instance_optimized列将与示例中的instance列完全匹配。
内容的提问来源于stack exchange,提问作者Basil
相关产品推荐
相关产品推荐

