如何按分组筛选出最早重复日期对应的所有记录?
筛选个体最早重复日期的所有记录
给定一个按个体(id)记录事件的data.frame(已预先移除重复行),需求是筛选出每个个体最早出现重复的日期对应的所有记录;若个体没有重复日期,则直接排除。
原始数据
df <- data.frame(id=as.integer(c(123,123,123,124,124,124,125,125,125,126,126,126)), date=as.Date(c("2014-03-12", "2014-03-12", "2015-09-16", "2015-10-24", "2016-12-11", "2016-12-11", "2017-08-06", "2017-11-26", "2018-01-29", "2015-09-16", "2015-09-16", "2015-09-16")), fruit=as.character(c("Apple", "Orange", "Passion fruit", "Banana", "Lemon", "Strawberry", "Banana", "Apple", "Passion fruit", "Orange", "Blueberry", "Pineapple")), row=rep(c(1, 2, 3)))
数据展示:
id date fruit row 1 123 2014-03-12 Apple 1 2 123 2014-03-12 Orange 2 3 123 2015-09-16 Passion fruit 3 4 124 2015-10-24 Banana 1 5 124 2016-12-11 Lemon 2 6 124 2016-12-11 Strawberry 3 7 125 2017-08-06 Banana 1 8 125 2017-11-26 Apple 2 9 125 2018-01-29 Passion fruit 3 10 126 2015-09-16 Orange 1 11 126 2015-09-16 Blueberry 2 12 126 2015-09-16 Pineapple 3
解决方案
方法1:Base R 实现
通过统计日期出现次数、定位最早重复日期,最后匹配筛选记录:
# 统计每个id-date组合的记录数 date_counts <- with(df, table(id, date)) dup_dates <- as.data.frame(date_counts[date_counts >= 2]) names(dup_dates) <- c("id", "date", "count") dup_dates$id <- as.integer(as.character(dup_dates$id)) dup_dates$date <- as.Date(as.character(dup_dates$date)) # 提取每个id最早的重复日期 earliest_dup <- aggregate(date ~ id, data = dup_dates, FUN = min) # 匹配筛选原始数据并排序 result <- merge(df, earliest_dup, by = c("id", "date")) result <- result[order(result$id, result$row), ] rownames(result) <- NULL # 查看结果 result
输出结果:
id date fruit row 1 123 2014-03-12 Apple 1 2 123 2014-03-12 Orange 2 3 126 2015-09-16 Orange 1 4 126 2015-09-16 Blueberry 2 5 126 2015-09-16 Pineapple 3
方法2:dplyr 实现(更简洁)
利用dplyr的分组链式操作,一步完成筛选:
library(dplyr) result <- df %>% group_by(id, date) %>% mutate(date_count = n()) %>% # 统计每个id-date的记录数 ungroup() %>% group_by(id) %>% filter(date_count >= 2) %>% # 保留存在重复的日期记录 filter(date == min(date)) %>% # 保留每个id最早的重复日期记录 select(-date_count) %>% # 移除临时计算列 arrange(id, row) %>% # 按id和row排序 ungroup() # 查看结果 result
输出与Base R方法一致。
内容的提问来源于stack exchange,提问作者Nao
相关产品推荐
相关产品推荐

