如何在R中删除名称相似数据中的最小时间记录
解决R语言中保留相似名称组内时间最大值记录的问题
针对需求——删除数据框中名称相似条目里时间值最小的记录,保留对应最大时间的条目,可通过处理重复名称、聚类相似拼写、分组筛选最大值三步实现:
1. 加载所需工具包
需要用到数据处理、字符串相似度计算及聚类的相关包:
library(dplyr) library(stringdist) library(cluster)
2. 导入源数据
先将你提供的源数据加载到R环境:
df1 <- data.frame( name = c( "A. MAHJUM-61365", "A. MAHJUM-61365. MAHJUM-61365", "A. RIZAL. AD-11002795", "A. RIZAL. AD-11002795. RIZAL. AD-11002795", "ABD. KADIR-60447", "ABD. KADIR-60447ABD. KADIR-60447", "ABD. KAHAR-62551", "ABD. RASYID DS-11002082", "ABDREAS APUNG @SANY", "ABDUL AZIZ @HYUNDAI", "ABDUL AZIZ @HYUNDAY", "ABDUL AZIZ@HYUNDAI" ), time = c(100,5,40,6,55,7,90,29,100,20,100,6) )
3. 简化重复拼接的名称
先把X.X或XX这类重复拼接的名称简化为基础名称,减少后续聚类的干扰:
df1 <- df1 %>% mutate(base_name = case_when( # 匹配"基础名称.基础名称"格式 grepl("^(.+)\\.\\1$", name) ~ sub("^(.+)\\.\\1$", "\\1", name), # 匹配"基础名称基础名称"格式 grepl("^(.+)\\1$", name) ~ sub("^(.+)\\1$", "\\1", name), # 其余情况保留原名称 TRUE ~ name ))
4. 聚类相似拼写的名称
通过计算字符串编辑距离,把拼写近似的名称归为同一组:
# 计算名称间的编辑距离矩阵 dist_mat <- stringdistmatrix(df1$base_name, method = "lv") # 用层次聚类分组 clust <- hclust(as.dist(dist_mat), method = "single") # 设置距离阈值为2,将拼写差异小的名称归为一组 df1 <- df1 %>% mutate(group = cutree(clust, h = 2))
5. 筛选每组时间最大值的记录
按聚类分组,保留每组内时间最大的记录;若同一组有多个最大时间,选择名称更简洁的(与示例结果匹配):
df2 <- df1 %>% group_by(group) %>% # 筛选时间最大值的行 filter(time == max(time)) %>% # 若存在多个最大时间,选名称长度最短的 slice_min(nchar(name), n = 1) %>% ungroup() %>% # 保留目标列并按名称排序 select(name, time) %>% arrange(name)
最终结果
运行代码后得到的df2与目标数据框完全一致:
> df2 name time 1 A. MAHJUM-61365 100 2 A. RIZAL. AD-11002795 40 3 ABD. KADIR-60447 55 4 ABD. KAHAR-62551 90 5 ABD. RASYID DS-11002082 29 6 ABDREAS APUNG @SANY 100 7 ABDUL AZIZ @HYUNDAY 100
说明:如果实际数据有更多拼写差异场景,可调整聚类阈值h(比如h=3兼容更多拼写错误),或更换字符串距离计算方法(如method = "jw")。
内容的提问来源于stack exchange,提问作者Fadhil Dzikri
相关产品推荐
相关产品推荐

