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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 14:17:07