在R中如何查找姓氏或名字相同且邮编一致的相似数据记录?
实现方案
你之前的代码是基于surname和first_name两个字段同时重复来判断重复项,要筛选满足「surname或first_name相同,且postcode也相同」的相似记录,可通过分组计数的逻辑实现,只要对应分组下记录数≥2,组内的所有记录都符合匹配规则。
base R 实现代码
# 构造两个分组标识:分别对应 surname+postcode 组合、first_name+postcode 组合 group_surname_post <- paste(my_data$surname, my_data$postcode, sep = "_") group_firstname_post <- paste(my_data$first_name, my_data$postcode, sep = "_") # 统计每个分组的记录数,计数≥2说明该分组下存在相似记录 dup_surname_post <- ave(rep(1, nrow(my_data)), group_surname_post, FUN = length) >= 2 dup_firstname_post <- ave(rep(1, nrow(my_data)), group_firstname_post, FUN = length) >= 2 # 筛选符合任意一个匹配规则的记录,unique用于避免同一条记录被多次匹配返回 similar_records <- unique(my_data[dup_surname_post | dup_firstname_post, ])
dplyr 简洁实现(需要提前安装加载dplyr包)
library(dplyr) similar_records <- my_data %>% # 按surname+postcode分组,标记组内记录数≥2的行 group_by(surname, postcode) %>% mutate(dup_surname = n() >= 2) %>% ungroup() %>% # 按first_name+postcode分组,标记组内记录数≥2的行 group_by(first_name, postcode) %>% mutate(dup_firstname = n() >= 2) %>% ungroup() %>% # 筛选满足任意一个条件的记录 filter(dup_surname | dup_firstname) %>% # 清除临时标记列、去重 select(-dup_surname, -dup_firstname) %>% distinct()
补充说明
- 如果需要合并之前查到的全字段完全重复记录和本次的相似记录,直接调用
rbind(duplicates, similar_records)后再去重即可。 - 如果不需要保留组内所有相似记录,只需要保留重复的第一条之后的记录,把代码中的
length >=2/n()>=2替换为duplicated()判断即可。
内容的提问来源于stack exchange,提问作者PDD
相关产品推荐
相关产品推荐

