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

如何基于除date外的所有列识别并删除重复行(保留最新日期)

处理R语言DataFrame重复行:保留最新日期记录

需求说明

基于ID、Fn、Ln列(除date外的所有列)识别重复行,对每组重复行仅保留date值最新的条目,同时保留所有列,非重复行直接保留。

原始数据集

data <- data.frame(ID=c(1, 1, 6, 2, 2, 3, 3, 4, 4, 5, 5), 
                   Fn=c("Joe", "Joe", "Joe", "Stacy", "Stacy", "Craig", "Craig", "Leo", "Leo", "Penny", "Penny"), 
                   Ln=c("Schmoe", "Schmoe", "Schmoe", "Fakename", "Fakename", "Collins", "Collins", "Fern", "Fern", "Diamond", "Diamond"), 
                   date=c("2001-01-01", "2010-01-01", "2001-01-01", "2002-02-02", "2020-02-02", "2030-03-03", "2003-03-03", "2040-04-04", "2004-04-04", "2005-05-05", "2050-05-05")
)

解决方案

方法1:Base R 实现

无需额外安装包,通过分组、排序筛选完成:

# 转换date列为日期格式(确保日期比较逻辑准确)
data$date <- as.Date(data$date)

# 按ID、Fn、Ln分组,每组内按日期升序排序后取最后一行(最新日期)
result_base <- do.call(rbind, lapply(split(data, list(data$ID, data$Fn, data$Ln)), function(group) {
  sorted_group <- group[order(group$date), ]
  sorted_group[nrow(sorted_group), ]
}))

# 重置行名,避免分组带来的复合行名
rownames(result_base) <- NULL

方法2:dplyr 包实现(更简洁直观)

使用tidyverse生态的dplyr包,代码可读性更强:

# 未安装dplyr时先执行:install.packages("dplyr")
library(dplyr)

result_dplyr <- data %>%
  # 转换日期格式
  mutate(date = as.Date(date)) %>%
  # 按ID、Fn、Ln分组
  group_by(ID, Fn, Ln) %>%
  # 筛选每组中日期最大的行
  filter(date == max(date)) %>%
  # 取消分组状态
  ungroup()

最终结果示例

两种方法得到的结果一致,保留的记录如下:

ID    Fn       Ln       date
1   1   Joe   Schmoe 2010-01-01
2   6   Joe   Schmoe 2001-01-01
3   2 Stacy Fakename 2020-02-02
4   3 Craig  Collins 2030-03-03
5   4   Leo     Fern 2040-04-04
6   5 Penny  Diamond 2050-05-05

内容的提问来源于stack exchange,提问作者user22757672

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 19:16:22