R语言按id与break标识分组拆解累计求和值获取单日数值
R语言实现累计值拆解为单日实际值
需求说明
现有数据集ds,包含4个字段:
id:主体标识date:日期values:累计求和值break.:累计重置标识,取值为"True"时累计过程重置,之后重新开始累计
需要按id分组后,在相邻两次break. == "True"的区间内计算单日实际值:后一日累计值减去前一日累计值,差值为负时取值为0,每个重置区间的首行对应值为当日实际值。
实现代码
使用dplyr包即可快速实现需求,代码如下:
library(dplyr) library(lubridate) # 读取示例数据(未执行过可运行) ds <- read.csv("https://raw.githubusercontent.com/Leprechault/trash/main/accumulated_values_table") ds$date <- ymd(ds$date) # 计算单日值 ds_result <- ds %>% # 按id分组,按日期排序保证时间顺序正确 group_by(id) %>% arrange(date, .by_group = TRUE) %>% # 生成重置分组:每次遇到break.为True时进入新的分组 mutate(reset_grp = cumsum(break. == "True")) %>% # 按id和重置分组二次分组 group_by(id, reset_grp) %>% # 计算单日值:组内首行取原值,后续行取与前一行的差值,负值取0 mutate(values = pmax(values - lag(values, default = 0), 0)) %>% ungroup() %>% # 去掉辅助计算列 select(-reset_grp)
结果验证
筛选id=3的结果查看,即可匹配预期输出:
ds_result %>% filter(id == 3) %>% head()
内容的提问来源于stack exchange,提问作者Leprechault
相关产品推荐
相关产品推荐

