在有重复的数据中只保留时间最大的一条数据
1. 选出目标字段有重复的数据
这里介绍两种方法:
- 通过dplyr包,根据目标字段(key_name)聚合再计数选出条数大于1的数据行
# 只选出有重复的目标字段
duplicate_name = df %>% group_by(key_name)
%>% summarise(freq = n())
%>% filter(freq > 1)
%>% select(key_name)
- 通过sqldf包,写sql语句使用having选出计数大于1
duplicate_name = sqldf("select key_name , count(key_name ) count from df
group by key_name
having count > 1")$key_name
数据量大的适合推荐使用第二种,速度快很多,且占用少量资源
根据重复名称选出数据
duplicate_data = df[df$key_name %in% duplicate_name$key_name, ]
2. 在重复的数据行中选出时间最大的数据
clear_duplicate_info = duplicate_data %>% group_by(key_name)
%>% filter(date == max(date))
完整代码
应用场景:企业的存续注销都存在的情况,只选出存续的id以及相关数据;根据数据的业务情况,这里采用只保留成立时间最近(即最大)的一条数据
company_better_distinct = function(df){
# 数据量大的话,groupby效率太低且占资源,用sqldf速度快很多
# duplicate_name = df %>% group_by(company_name) %>% summarise(freq=n()) %>% filter(freq>1) %>% select(company_name)
duplicate_name = sqldf("select company_name, count(company_name) count from df group by company_name having count > 1")$company_name
other = df[!df$company_name %in% duplicate_name$company_name, ]
duplicate_info = df[df$company_name %in% duplicate_name$company_name, ]
clear_duplicate_info = duplicate_info %>% group_by(company_name) %>% filter(esdate == max(esdate))
clear_duplicate_info = as.data.frame(clear_duplicate_info)
out = rbind(other, clear_duplicate_info)
return(out)
}