R语言:合并含重复事件的DataFrame并统计手术日30天内样本数
手术日期前后30天样本统计解决方案
核心思路
通过按患者ID关联两个数据集,让每一条手术记录匹配到该患者的所有样本记录,计算样本日期与手术日期的天数差,筛选出前后30天的范围后统计样本数量。
修正测试数据(原数据日期无重叠,调整后便于验证)
library(dplyr) # df1:患者ID + 手术日期 id <- c(1, 2, 3, 4) sx_date <- seq(as.Date("2010-01-01"), as.Date("2010-10-09"), by = "6 days") df1 <- expand.grid(id = id, sx_date = sx_date) # df2:患者ID + 样本日期 + 样本名称 id <- c(1, 2, 3, 4) sample_date <- seq(as.Date("2009-12-01"), as.Date("2010-11-09"), by = "4 days") sample <- rep(c("hgb","crp","Na","K"), each=5) df2 <- expand.grid(id = id, sample_date = sample_date, sample = sample) %>% arrange(id)
步骤1:按ID合并数据集并计算日期差
# 按ID关联,让每条手术记录匹配同ID的所有样本 merged_data <- df1 %>% left_join(df2, by = "id") %>% # 计算样本日期与手术日期的天数差(负数表示样本在手术前) mutate(date_diff = as.numeric(difftime(sample_date, sx_date, units = "days")))
步骤2:筛选范围并统计样本数量
统计每个手术对应的总样本数
total_sample_count <- merged_data %>% # 筛选手术前后30天内的样本(包含手术当天) filter(between(date_diff, -30, 30)) %>% # 按患者ID和手术日期分组统计 group_by(id, sx_date) %>% summarise(total_samples = n(), .groups = "drop")
按样本类型细分统计
如果需要统计每个手术前后30天内各类型样本的数量,用以下代码:
sample_type_count <- merged_data %>% filter(between(date_diff, -30, 30)) %>% group_by(id, sx_date, sample) %>% summarise(type_count = n(), .groups = "drop")
关键说明
- 使用
left_join确保不会丢失df1中的任何手术记录 difftime的units = "days"参数确保计算的是天数差,转成数值型后方便用between筛选范围.groups = "drop"用于分组统计后取消分组状态,避免后续操作的潜在问题
内容的提问来源于stack exchange,提问作者r_newbie
相关产品推荐
相关产品推荐

