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

R数据集患者去重需求:30天内同一患者仅保留一条记录

处理R语言数据集:同一患者30天内仅保留一条记录

核心代码实现

假设你的数据集名为df,包含patient_id(患者唯一标识)和record_date(记录日期)两列。先确保日期列是标准Date类型,再根据数据集规模选择合适的处理方案:

方案1:用dplyr(适合常规规模数据集)

# 转换日期格式(如果原始数据不是Date类型)
df$record_date <- as.Date(df$record_date)

library(dplyr)
processed_df <- df %>%
  arrange(patient_id, record_date) %>%
  group_by(patient_id) %>%
  # 计算当前记录与上一条的间隔天数,第一条记录默认与31天前的虚拟记录对比
  mutate(days_since_last = record_date - lag(record_date, default = first(record_date) - 31)) %>%
  # 筛选间隔超过30天的记录
  filter(days_since_last > 30) %>%
  select(-days_since_last) %>%
  ungroup()

方案2:用data.table(适合超大规模数据集,速度更快)

library(data.table)

setDT(df)
# 转换日期格式
df[, record_date := as.Date(record_date)]
# 按患者ID和日期排序
setorder(df, patient_id, record_date)

# 分组筛选:保留第一条记录,以及与上一条间隔超过30天的记录
processed_df <- df[, .SD[ c(TRUE, diff(record_date) > 30) ], by = patient_id]

大规模数据集的验证方法

由于数据集规模极大,无法全量手动核对,可通过以下方式验证代码正确性:

  • 抽样手动验证:随机抽取少量患者的原始数据和处理后数据,手动核对是否符合规则:
# 随机抽取15个患者
sample_patients <- sample(unique(df$patient_id), 15)
# 提取对应原始数据和处理后数据
sample_raw <- df[df$patient_id %in% sample_patients, ]
sample_processed <- processed_df[processed_df$patient_id %in% sample_patients, ]
# 查看对比
View(sample_raw)
View(sample_processed)
  • 统计规则校验:自动检查处理后数据是否存在同一患者30天内重复的记录:
validation_result <- processed_df %>%
  arrange(patient_id, record_date) %>%
  group_by(patient_id) %>%
  mutate(interval = record_date - lag(record_date)) %>%
  # 筛选出间隔≤30天的异常记录
  filter(!is.na(interval) & interval <= 30)

# 如果结果行数为0,说明规则执行正确
cat("是否存在异常记录:", nrow(validation_result) != 0, "\n")
  • 边界场景测试:构造包含边界情况的小数据集,验证代码逻辑:
# 构造测试数据:患者1有3条记录(间隔19天、26天),患者2有2条记录(间隔29天)
test_df <- data.frame(
  patient_id = c(1,1,1,2,2),
  record_date = as.Date(c("2023-01-01", "2023-01-20", "2023-02-15", "2023-03-01", "2023-03-30"))
)

# 用方案2处理测试数据
setDT(test_df)
test_df[, record_date := as.Date(record_date)]
setorder(test_df, patient_id, record_date)
test_processed <- test_df[, .SD[ c(TRUE, diff(record_date) > 30) ], by = patient_id]

# 预期结果:患者1保留2023-01-01、2023-02-15;患者2仅保留2023-03-01
print(test_processed)

内容的提问来源于stack exchange,提问作者Amanda Marie Egeskov-Cavling

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 06:10:58