如何基于除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
相关产品推荐
相关产品推荐

