在R语言中如何用df2替换df1中匹配的重复数据
在R语言中用标准数据集df2替换df1中的重复拼接/相似数据
需求说明
df1中存在两类需要修正的条目:
- 重复拼接的标准条目(如将"A. MAHJUM-61365"重复拼接为"A. MAHJUM-61365. MAHJUM-61365"或"ABD. KADIR-60447ABD. KADIR-60447")
- 拼写/格式相近的非标准条目(如"ABDUL AZIS @HYUNDAI"和"ABDUL AZIZ@HYUNDAI"对应df2中的"ABDUL AZIS @HYUNDAY")
需要将这些条目全部替换为df2中的标准值,使df1的有效内容与df2一致。
解决方案代码
library(stringr) # 定义原始数据集 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 AZIS @HYUNDAY", "ABDUL AZIS @HYUNDAI", "ABDUL AZIZ@HYUNDAI" )) df2 <- data.frame( name = c( "A. MAHJUM-61365", "A. RIZAL. AD-11002795", "ABD. KADIR-60447", "ABD. KAHAR-62551", "ABD. RASYID DS-11002082", "ABDREAS APUNG @SANY", "ABDUL AZIS @HYUNDAY" )) # 第一步:替换重复拼接的条目 for (standard_name in df2$name) { # 构建正则表达式,匹配标准值重复出现的情况(兼容点分隔、空格分隔或无分隔的拼接) pattern <- str_c("(", str_replace_all(standard_name, "\\.", "\\\\."), ")(\\.\\s*|)", "\\1+") df1$name <- str_replace_all(df1$name, pattern, standard_name) } # 第二步:替换拼写/格式相近的条目(基于字符串编辑距离匹配最接近的标准值) df1$name <- sapply(df1$name, function(x) { distance <- adist(x, df2$name) df2$name[which.min(distance)] }) # 输出处理后的结果 print(df1)
代码说明
重复拼接处理:
- 遍历df2中的每个标准条目,构建正则表达式匹配该条目重复出现的场景(包括带点分隔、空格分隔或直接拼接的情况)。
- 使用
str_replace_all将匹配到的重复内容替换为标准条目。
拼写/格式相近处理:
- 用
adist函数计算df1条目与df2所有标准条目的编辑距离(衡量字符串差异程度的指标)。 - 选取距离最小的标准条目作为替换值,解决拼写错误或格式差异的问题。
- 用
处理后结果
运行代码后,df1的name列将完全匹配df2中的标准条目,结果如下:
name 1 A. MAHJUM-61365 2 A. MAHJUM-61365 3 A. RIZAL. AD-11002795 4 A. RIZAL. AD-11002795 5 ABD. KADIR-60447 6 ABD. KADIR-60447 7 ABD. KAHAR-62551 8 ABD. RASYID DS-11002082 9 ABDREAS APUNG @SANY 10 ABDUL AZIS @HYUNDAY 11 ABDUL AZIS @HYUNDAY 12 ABDUL AZIS @HYUNDAY
内容的提问来源于stack exchange,提问作者Fadhil Dzikri
相关产品推荐
相关产品推荐

