You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 00:06:02