在 R 中,有没有办法在数据框中的两列中识别相似的字符串值?

In R, is there a way to identify similar string values in two columns in a dataframe?

我有一个包含 70,000 个观察值的大型数据框,其中 A 列和 B 列有成对的护士和医生在同一个班次一起工作。不幸的是,这里和那里有一些观察(我不能完全估计有多少,但它是少数),他们在 A 列和 B 列中是同一个人,但由于添加了中间名或他们的名字拼写略有不同一栏中的昵称,但另一栏中没有。我想创建一个只有这些行的数据框。有没有办法使用 %like% 和哪个函数或类似的东西来识别所有这些行?

这是我的例子:

A B
Jimmy Fallon Harry Potter
Jimmy Fallon James Fallon
Harry Potter John Oliver
Harry Potter Harold Potter

我想要的:

A B
Jimmy Fallon James Fallon
Harry Potter Harold Potter

一个可能的选择是对距离较近的行使用 adist 然后 filter。这种方法假设每一列中都有一个公共元素(例如,姓氏)。

library(tidyverse)

df %>% 
  rowwise() %>% 
  filter(adist(x=A,y=B,ignore.case=TRUE) <= 3)

输出

  A            B            
  <chr>        <chr>        
1 Jimmy Fallon James Fallon 
2 Harry Potter Harold Potter

或以 R 为基数:

df[subset(t(t(mapply(adist, df$A, df$B))) <= 3),]

数据

df <- structure(list(A = c("Jimmy Fallon", "Jimmy Fallon", "Harry Potter", 
"Harry Potter"), B = c("Harry Potter", "James Fallon", "John Oliver", 
"Harold Potter")), class = "data.frame", row.names = c(NA, -4L
))

确定截止值

您可能需要根据您的数据更改截止过滤值。但是,当名称略有拼写错误时,您可以获得距离并找到最佳截止点。

df2 <- data.frame(A = c("Jimmy Fallon", "Jimmy Fallon", "Harry Potter", "Hary Poter"), 
                 B = c("Harry Potter", "James Fallo", "John Oliver", "Harold Potter"))

df %>% 
  rowwise() %>% 
  mutate(dist = adist(x=A,y=B,ignore.case=TRUE)) %>%
  as.data.frame %>% 
  arrange(dist)

             A             B dist
1 Jimmy Fallon   James Fallo    4
2   Hary Poter Harold Potter    4
3 Harry Potter   John Oliver    9
4 Jimmy Fallon  Harry Potter   10

所以,现在我们知道 4 是更好的过滤截止值。