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

多条件去重:如何保留每个个体最新g_date对应的所有行

保留每个个体最新学位授予日期的所有行(R语言解决方案)

部分个体因获取多个学位在数据中重复出现,需仅保留每个个体**最新学位授予日期(g_date)**对应的所有行。现有代码仅能保留每个个体的一行数据,无法满足需求。

当前输出样例

people | g_date   | wage|quarter 
personA|2009-01-01|100  |20201
personA|2009-01-01|100  |20202
personA|2010-01-01|100  |20201
personA|2010-01-01|100  |20202
personB|2012-01-01|50   |20201
personB|2012-01-01|50   |20202
personB|2012-01-01|50   |20203

期望输出样例

people | g_date   | wage|quarter 
personA|2010-01-01|100  |20201
personA|2010-01-01|100  |20202
personB|2012-01-01|50   |20201
personB|2012-01-01|50   |20202
personB|2012-01-01|50   |20203

现有代码问题

你当前使用的代码通过duplicated()仅保留每个个体的最后一行,无法保留最新g_date对应的所有记录:

df<-df[order(df$g_date),]
df<-df[!duplicated(df$people, fromLast = TRUE),]

解决方案

方法1:Base R实现

先计算每个个体的最新学位日期,再匹配筛选出对应所有行:

# 确保g_date为日期格式(若原始数据不是的话)
df$g_date <- as.Date(df$g_date)

# 计算每个个体的最新学位授予日期
latest_dates <- aggregate(g_date ~ people, data = df, max)

# 筛选出符合条件的所有行
df_filtered <- merge(df, latest_dates, by = c("people", "g_date"))

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

使用dplyr的分组筛选功能,一步完成:

library(dplyr)

df_filtered <- df %>%
  mutate(g_date = as.Date(g_date)) %>%
  group_by(people) %>%
  filter(g_date == max(g_date)) %>%
  ungroup()

两种方法都能保留每个个体最新g_date对应的所有行,比如personA的2010-01-01两条记录会全部保留,personB因只有一个学位日期,所有记录都会保留。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 06:25:06