如何在R中按MRN分组查找重复的OBSERVATION_DATE记录
R中按MRN分组标记组内重复日期
问题说明
现有代码仅全局检查OBSERVATION_DATE的重复,未按MRN分组,导致不同MRN的相同日期也会被误标记。需要修改为仅同一MRN分组内的重复日期才标记为TRUE,且不使用data.table解决方案。
示例数据:
library(anytime) # 需先加载anytime包解析日期 sample <- data.frame(MRN = c(1, 2, 1, 2, 3, 4, 3), OBSERVATION_DATE = anydate(c("2013-02-19", "2013-02-28", "2013-02-19", "2013-02-28", "2013-02-28", "2013-03-08", "2014-01-06")))
方案1:基础R实现(无需额外包)
利用ave()函数按MRN分组,在每个组内判断日期是否重复:
# 按MRN分组处理,先将日期转字符避免类型问题 sample$dupobs <- with(sample, ave(as.character(OBSERVATION_DATE), MRN, FUN = function(x) duplicated(x) | duplicated(x, fromLast = TRUE))) # 转换为逻辑值类型 sample$dupobs <- as.logical(sample$dupobs)
方案2:dplyr包实现(tidyverse风格)
通过group_by()按MRN分组,在组内标记重复日期:
library(dplyr) sample <- sample %>% group_by(MRN) %>% mutate(dupobs = duplicated(OBSERVATION_DATE) | duplicated(OBSERVATION_DATE, fromLast = TRUE)) %>% ungroup()
验证结果
运行代码后,sample的dupobs列结果如下:
| MRN | OBSERVATION_DATE | dupobs |
|---|---|---|
| 1 | 2013-02-19 | TRUE |
| 2 | 2013-02-28 | TRUE |
| 1 | 2013-02-19 | TRUE |
| 2 | 2013-02-28 | TRUE |
| 3 | 2013-02-28 | FALSE |
| 4 | 2013-03-08 | FALSE |
| 3 | 2014-01-06 | FALSE |
完全符合需求:仅同一MRN下的重复日期被标记为TRUE,不同MRN的相同日期(如第5条的2013-02-28)未被误标记。
内容的提问来源于stack exchange,提问作者stephr
相关产品推荐
相关产品推荐

