多条件去重:如何保留每个个体最新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
相关产品推荐
相关产品推荐

