如何在R语言中清理拼写存在差异的重复值?
在R语言中移除拼写不同的重复值
这里的需求是:同一Score下拼写相似的Name视为重复项,每组保留一个标准名称(如示例中的Abby、Tom)。
原始数据
name <- c('Abi', 'Abby', 'Aby', 'Toom', 'Tom', 'Tm', 'Crow') score <- c(12,12,12,4,4,4,9) duplicate <- data.frame(name, score)
解决方案
方法一:手动映射(适合小数据集)
如果已知所有拼写变体对应的标准名称,可直接创建映射表替换后去重:
# 定义变体到标准名称的映射 name_map <- c( 'Abi' = 'Abby', 'Aby' = 'Abby', 'Toom' = 'Tom', 'Tm' = 'Tom' ) # 替换变体名称 duplicate$standard_name <- ifelse(duplicate$name %in% names(name_map), name_map[duplicate$name], duplicate$name) # 按标准名称和分数去重,保留每组第一条 result <- duplicate[!duplicated(duplicate[c('standard_name', 'score')]), ] # 调整列名和顺序 result <- result[, c('standard_name', 'score')] colnames(result) <- c('Name', 'Score') print(result)
方法二:基于字符串相似度自动聚类(适合大数据集)
使用stringdist包计算字符串编辑距离,自动识别每组内最具代表性的名称:
# 安装并加载所需包 install.packages('stringdist') install.packages('dplyr') library(stringdist) library(dplyr) # 分组处理:找到每组内最接近其他名称的标准值 result <- duplicate %>% group_by(score) %>% mutate( # 计算每个名称与组内其他名称的平均编辑距离 avg_dist = sapply(name, function(x) mean(stringdist(x, name, method = 'lv'))), # 选择平均距离最小的名称作为标准 standard_name = name[which.min(avg_dist)] ) %>% ungroup() %>% # 去重并调整列名 distinct(standard_name, score, .keep_all = FALSE) %>% rename(Name = standard_name, Score = score) print(result)
输出结果
Name Score 1 Abby 12 2 Tom 4 3 Crow 9
内容的提问来源于stack exchange,提问作者Roshan
相关产品推荐
相关产品推荐

