用于识别名称变体的 R 函数?

时间:2021-06-03 04:08:50

标签: r string

我正在处理一个庞大的姓名数据集,需要能够按个人进行分组。可能在数据集中存在看起来不同但属于同一个人的名字,例如 John Doe 或 John A. Doe,或 Michael Smith 和 Mike Smith。 R 有没有办法找到这样的实例并将它们识别为同一个人?

df <- data.frame(
  name = c("John Doe", "John A. Doe", "Jane Smith", "Jane Anderson", "Jane Anderson Lowell",
           "Jane B. Smith", "John Doe", "Jane Smith", "Michael Smith",
"Mike Smith", "A.K. Ross", "Ana Kristina Ross"),
  rating = c(1,2,1,1,2,3,1,4,2,1,3,2)
)

这里有多个重复的个体,无论是中间名首字母、缩写名、加长名还是姓氏改变的人。我一直在尝试找到一个函数,该函数可以给出名称匹配中字符的相似度百分比,然后我可以手动检查高百分比的案例,以评估它们是否确实是同一个人。我的最终目标是找到每个人的平均评分,我需要按个人排序。

2 个答案:

答案 0 :(得分:0)

实际解决方案取决于您的数据及其可能具有的变化。如何识别一个独特的个体?也许从每个 name 中提取名字和姓氏会有所帮助?

library(dplyr)
library(stringr)

df %>%
  group_by(firstname = word(name, 1), 
           lastname = word(name, -1)) %>%
  summarise(rating = mean(rating)) %>%
  ungroup

# firstname lastname rating
#  <chr>     <chr>     <dbl>
#1 Jane      Anderson   1   
#2 Jane      Smith      1.33
#3 John      Doe        2   

答案 1 :(得分:0)

我们可以使用 extract 中的 tidyr

library(dplyr)
library(tidyr)
df %>% 
    tidyr::extract(name, into = c('firstname', 'lastname'), 
        "^(\\w+).*\\s(\\w+)$") %>% 
    group_by(firstname, lastname) %>% 
    summarise(rating = mean(rating, na.rm = TRUE), .groups = 'drop')
# A tibble: 3 x 3
  firstname lastname rating
  <chr>     <chr>     <dbl>
1 Jane      Anderson   1   
2 Jane      Smith      1.33
3 John      Doe        2