R中更有效的模糊匹配方法?

时间:2019-05-16 03:34:46

标签: r

我目前正在处理具有200万行(记录)的数据框。我想确定潜在的重复记录以进行跟踪。有人为我编写了一个长代码,可以正常工作,但是目前它使我需要一整夜才能运行。

它使用stringdist包。据我了解,stringdist的工作方式是将一行与数据帧中的所有其他行进行比较。因此,具有5行的数据帧将需要20次计算:


第1行与第2行比较
第1行与第3行比较
第1行与第4行比较
第1行与第5行比较
第2行与第1行比较
第2行与第3行比较
第2行与第4行比较
第2行与第5行比较
第3行与第1行比较
第3行与第2行比较
第3行与第4行比较
第3行与第5行比较
第4行与第1行比较
第4行与第2行比较
第4行与第3行比较
第4行与第5行比较
第5行与第1行比较
第5行与第2行比较
第5行与第3行比较
第5行与第4行比较

数据帧大小的增加将成倍地增加完成功能所需的时间。对于我相当大的数据帧,显然需要一段时间。

我提出的解决方案是:将每一行与数据帧中的所有其他行进行比较之后,是否有办法在将来的计算中忽略这些行?例如,在上面的示例中,第1行与第2行的比较与第2行与第1行的比较相同。我们可以删除其中的一种计算吗?

因此,使用上面的示例数据框,唯一的计算应为:

第1行与第2行相比
第1行与第3行比较
第1行与第4行比较
第1行与第5行比较
第2行与第3行比较
第2行与第4行比较
第2行与第5行比较
第3行与第4行比较
第3行与第5行比较
第4行与第5行比较

这是代码中函数的一部分,用于在各个列中查找这些重复项-有关如何修改此内容的任何想法?

lastName <- stringdist(DataND$SURNAME[rownumber],DataND$SURNAME, method='lv')
firstName <- stringdist(DataND$GIVEN.NAME[rownumber],DataND$GIVEN.NAME, method='lv')
birthDate <- stringdist(DataND$DOB[rownumber],DataND$DOB, method='lv')
streetAddress<-stringdist(DataND$ADDR.1[rownumber],DataND$ADDR.1, method='lv')
suburb <- stringdist(DataND$LOCALITY[rownumber],DataND$LOCALITY, method='lv')

2 个答案:

答案 0 :(得分:1)

H 1的想法很棒。另一个选择是fuzzyjoin-package。

library(fuzzyjoin)
library(dplyr)

df <- tibble(id = seq(1,10),
             words = replicate(10, paste(sample(LETTERS, 5), collapse = "")))



stringdist_left_join(df, df, by = c(words = "words"), max_dist = 5, method = "lv", distance_col = "distance") %>%
  filter(distance != 0)

# A tibble: 90 x 5
    id.x words.x  id.y words.y distance
   <int> <chr>   <int> <chr>      <dbl>
 1     1 JUQYR       2 HQMFD          5
 2     1 JUQYR       3 WHQOM          4
 3     1 JUQYR       4 OUWJV          4
 4     1 JUQYR       5 JURGD          3
 5     1 JUQYR       6 ZMLAQ          5
 6     1 JUQYR       7 RWLVU          5
 7     1 JUQYR       8 AYNLE          5
 8     1 JUQYR       9 AUPVJ          4
 9     1 JUQYR      10 JDFEY          4
10     2 HQMFD       1 JUQYR          5
# ... with 80 more rows

到此为止所有步骤都已设置好,您可以按距离选择和取消行。 100.000条记录花了11秒。尝试使用stringdistmatrix()时出现错误:

  

错误:无法分配大小为37.3 Gb的向量

答案 1 :(得分:0)

lastName<-stringdist(DataND$SURNAME[rownumber], DataND$SURNAME, method='lv')

如果我理解这一行,它将一个姓(根据行号的值)与所有姓进行比较。因此,当您更改rownumber时,将进行所有比较,甚至包括先前已经进行的比较。

为防止这种情况,请尝试:

lastName<-stringdist(DataND$SURNAME[rownumber], DataND$SURNAME[rownumber:nrows], method='lv') 其中nrows是行数