使用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")
几个注意事项
- 日期格式检查:一定要确保
event_date是Date类型,否则日期比较会出错,用as.Date()转换就行。 - 多CAN记录的情况:如果同一组内有多个
CAN记录,之后有一个COMP,那么这些CAN都会被统计进去。如果你只想每组算一次,就用corrected_group_count那个统计方式。 - 大型数据集优化:处理超大数据时,尽量只保留必要的列(比如去掉不需要的描述列),减少内存占用;data.table的速度优势会更明显。
内容的提问来源于stack exchange,提问作者Tom O
相关产品推荐
相关产品推荐

