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

使用Dplyr条件逻辑统计取消后完成的重复程序行数

嘿,别慌!好久不用R确实容易手生,我帮你把这个统计逻辑拆解清楚,再给出可直接用的代码方案。

首先,咱们先明确核心需求的几个关键判断条件,避免歧义:

  • 必须是同一就诊(visit_id)、同一来源(source)、**同一程序(procedure)**的事件
  • 先有一条状态为CAN(取消)的记录,之后存在至少一条状态为COMP(完成)的记录,且COMP的日期晚于CAN的日期
  • 最终要统计满足上述条件的CAN事件次数(或者也可以统计有多少组这样的就诊-来源-程序组合,我都给你写进去)

假设你的数据集结构

首先假设你的数据集df包含以下必要列(如果列名不一样,你替换成自己的就行):

  • visit_id:就诊唯一标识
  • source:来源标识
  • procedure:程序名称/标识
  • status:事件状态(CAN或COMP)
  • event_date:事件发生日期(必须是Date类型,不是字符!)

用dplyr实现(直观易读,适合大多数场景)

如果你习惯用tidyverse系列的dplyr,这个方案最容易理解:

# 先加载必要的包
library(dplyr)

# 第一步:整理数据,按分组字段和日期排序(这步非常关键,保证时间顺序正确)
df_processed <- df %>%
  # 确保日期是Date类型,如果你的数据是字符,先转:event_date = as.Date(event_date)
  mutate(event_date = as.Date(event_date)) %>%
  arrange(visit_id, source, procedure, event_date) %>%
  # 按就诊、来源、程序分组
  group_by(visit_id, source, procedure) %>%
  # 标记当前CAN记录是否有后续的COMP记录
  mutate(
    # 检查本组内是否存在日期晚于当前CAN的COMP记录
    has_subsequent_comp = any(status == "COMP" & event_date > event_date[status == "CAN"]),
    # 只给符合条件的CAN记录打标记
    qualifies = status == "CAN" & has_subsequent_comp
  ) %>%
  ungroup()

# 统计满足条件的CAN事件总次数
corrected_event_count <- df_processed %>%
  filter(qualifies) %>%
  nrow()

# 如果想统计有多少组(就诊-来源-程序)存在这种修正情况
corrected_group_count <- df_processed %>%
  filter(qualifies) %>%
  distinct(visit_id, source, procedure) %>%
  nrow()

# 打印结果
cat("满足条件的取消事件次数:", corrected_event_count, "\n")
cat("存在修正的就诊-来源-程序组数量:", corrected_group_count, "\n")

用data.table实现(适合超大型数据集,速度更快)

如果你的数据集特别大(比如几百万行),dplyr可能有点慢,用data.table会更高效:

library(data.table)

# 转换为data.table格式
setDT(df)

# 确保日期是Date类型
df[, event_date := as.Date(event_date)]

# 按分组和日期排序
df <- df[order(visit_id, source, procedure, event_date)]

# 分组计算标记
df[, `:=`(
  has_subsequent_comp = any(status == "COMP" & event_date > event_date[status == "CAN"]),
  qualifies = status == "CAN" & any(status == "COMP" & event_date > event_date[status == "CAN"])
), by = .(visit_id, source, procedure)]

# 统计次数
corrected_event_count <- df[qualifies, .N]
corrected_group_count <- df[qualifies, uniqueN(.SD), by = .(visit_id, source, procedure)][, .N]

# 打印结果
cat("满足条件的取消事件次数:", corrected_event_count, "\n")
cat("存在修正的就诊-来源-程序组数量:", corrected_group_count, "\n")

几个注意事项

  1. 日期格式检查:一定要确保event_date是Date类型,否则日期比较会出错,用as.Date()转换就行。
  2. 多CAN记录的情况:如果同一组内有多个CAN记录,之后有一个COMP,那么这些CAN都会被统计进去。如果你只想每组算一次,就用corrected_group_count那个统计方式。
  3. 大型数据集优化:处理超大数据时,尽量只保留必要的列(比如去掉不需要的描述列),减少内存占用;data.table的速度优势会更明显。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 10:43:53