如何在R中按分组依据保留最新日期行、去除重复旧行?
问题分析
你的代码失效的核心原因是**date列是字符类型而非日期类型**,slice_max()会按字符串的字典序排序,而非实际的日期先后顺序。比如字符"2019"会被判定为比"2023/10/24"更大(字符串比较到第4位时"9">"3"),导致错误保留旧数据;另外像"2023/9/24"和"2023/10/24"这类日期,字符串排序也会出现逻辑错误。
解决方案
先将date列转换为标准日期格式,再按分组保留最新日期的记录:
library(tidyverse) library(lubridate) # 用于便捷处理多格式日期 df_join <- rbind(df1, df2) df_clean <- df_join %>% # 将字符型date转换为日期格式,自动识别"YYYY"和"YYYY/MM/DD"两种输入格式 mutate(date = parse_date_time(date, orders = c("Y", "Y/m/d"))) %>% # 按指定维度分组 group_by(Sector, block, lot, units) %>% # 保留每组中日期最新的行,with_ties=FALSE确保同一分组仅留一行 slice_max(date, with_ties = FALSE) %>% ungroup() # 取消分组状态,避免后续操作异常 # 查看清理后的结果 print(df_clean)
关键说明
- 如果不想额外加载lubridate包,也可以用基础R实现日期转换:
date = as.Date(date, tryFormats = c("%Y/%m/%d", "%Y")),效果一致。 - 若你的数据中同一分组可能存在多个相同的最新日期,可将
with_ties = FALSE改为TRUE,或添加额外筛选条件(比如按其他字段排序)。
内容的提问来源于stack exchange,提问作者Kledson Lemes
相关产品推荐
相关产品推荐

