我目前正在处理具有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')
答案 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
是行数