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

统计有无时间限制的相关未结案件数量(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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 22:47:52