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
相关产品推荐
相关产品推荐

