【问题标题】:R function for recognizing name variants?用于识别名称变体的 R 函数?
【发布时间】:2021-06-03 04:08:50
【问题描述】:

我正在处理一个庞大的姓名数据集,并且需要能够按个人进行分组。可能在数据集中存在看起来不同但属于同一个人的姓名,例如 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)
)

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

【问题讨论】:

  • 如果John A. Doe = John DoeJohn B. Doe = John DoeJohn A. Doe = John B. Doe

标签: r string


【解决方案1】:

实际的解决方案取决于您的数据及其可能具有的变化。你如何识别一个独特的个体?也许从每个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   

【讨论】:

    【解决方案2】:

    我们可以使用来自tidyrextract 来做到这一点

    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   
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-12
      • 1970-01-01
      • 2013-10-19
      • 1970-01-01
      • 1970-01-01
      • 2022-06-16
      相关资源
      最近更新 更多