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

如何按分组筛选出最早重复日期对应的所有记录?

筛选个体最早重复日期的所有记录

给定一个按个体(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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 20:57:32