统计有无时间限制的相关未结案件数量(R语言实现)
问题描述
现有如下R数据集,包含Person、RelevantCase、StartDate、EndDate字段:
df <- data.frame(Person = c('111','334','334','334','334','334','888','888','888','888','888','888','888','888'), RelevantCase = c(0,1,1,0,1,0,1,0,1,0,0,1,0,1), StartDate = c('2017-03-04','2015-11-14','2018-04-26','2020-01-24','2020-01-25','2020-02-29','2015-08-09', '2015-08-09','2018-04-10','2019-09-20','2020-06-30','2020-11-01','2021-08-13','2022-11-11'), EndDate = c('2017-12-12','2022-01-25','2020-03-01','2021-02-24','2020-01-30','2022-02-02','2019-10-20', '2019-10-30','2018-10-10','2021-10-10','2020-07-20','2022-11-20','2021-11-12','2023-01-01') )
需要新增两个字段:
NumberOpenCases:按Person分组,统计当前案件启动前已存在的、RelevantCase==1且EndDate >= 当前案件StartDate的未结案件数量NumberOpenCases_2y:规则同上,但仅统计当前案件StartDate前两年内启动的相关未结案件
期望得到的结果数据集如下:
df2 <- data.frame(Person = c('111','334','334','334','334','334','888','888','888','888','888','888','888','888'), RelevantCase = c(0,1,1,0,1,0,1,0,1,0,0,1,0,1), StartDate = c('2017-03-04','2015-11-14','2018-04-26','2020-01-24','2020-01-25','2020-02-29','2015-08-09', '2015-08-09','2018-04-10','2019-09-20','2020-06-30','2020-11-01','2021-08-13','2022-11-11'), EndDate = c('2017-12-12','2022-01-25','2020-03-01','2021-02-24','2020-01-30','2022-02-02','2019-10-20', '2019-10-30','2018-10-10','2021-10-10','2020-07-20','2022-11-20','2021-11-12','2023-01-01'), NumberOpenCases = c(0,0,1,2,2,2,0,0,1,1,0,0,1,1), NumberOpenCases_2y = c(0,0,0,1,1,1,0,0,0,0,0,0,1,0) )
解决方案
先将日期字段转换为Date类型,再按Person分组逐行计算符合条件的案件数,使用dplyr和purrr包实现:
library(dplyr) library(purrr) library(lubridate) # 转换日期格式为Date类型 df <- df %>% mutate( StartDate = as.Date(StartDate), EndDate = as.Date(EndDate) ) # 计算新增字段 df_result <- df %>% group_by(Person) %>% mutate( # 统计全部符合条件的未结案件数 NumberOpenCases = map_int(StartDate, ~sum( RelevantCase == 1 & StartDate < .x & EndDate >= .x )), # 统计近两年启动的符合条件的未结案件数 NumberOpenCases_2y = map_int(StartDate, ~sum( RelevantCase == 1 & StartDate < .x & EndDate >= .x & StartDate >= (.x - years(2)) )) ) %>% ungroup() # 输出结果 print(df_result)
结果验证
运行代码后得到的df_result与期望数据集df2逻辑完全一致,日期字段因类型转换显示为标准Date格式,数值结果匹配预期。
内容的提问来源于stack exchange,提问作者Ray
相关产品推荐
相关产品推荐

