我有一组 40,000 行 x 4 列的数据,需要将每一列与自己进行比较,以找到最接近的结果或最小的莱文斯坦距离。目的是为每一行获取一个“几乎相同”的副本。我用“adist”计算了一下,但速度似乎太慢。例如,对于只有一列的情况,将 5,000 行与整个数据集的 40,000 行进行比较,需要近两个小时的时间。对于 4 列来说,则需要 8 小时,对于整个数据集,则需要 32 小时。有没有更快的方法实现同样的效果?如果可能的话,我希望在 1 或 2 小时内完成。以下是我迄今为止所做的示例:
#vector example
a<-as.character(c("hello","allo","hola"))
b<-as.character(c("hello","allo","hola"))
#execution time
start_time <- Sys.time()
#Matrix with distance
dist.name<-adist(a,b, partial = TRUE, ignore.case = TRUE)
#time elapsed
end_time <- Sys.time()
end_time - start_time
Output:
Time difference of 5.873202 secs
#result
dist.name
[,1] [,2] [,3]
[1,] 0 4 5
[2,] 2 0 2
[3,] 5 4 0
期望输出(每行的最小距离,但同一行除外),但我需要更快的速度。
[1,] 4
[2,] 2
[3,] 4
which(a%in%b)
来将其清除,然后再对剩余部分运行 Levenshtein 距离的代码。 - boskifuzzyjoin
:通过使用fuzzyjoin::stringdist_inner_join(df, df)
,您可以基于一个或多个列将df
中的每一行与其最接近的邻居进行匹配。它使用stringdist
进行实际的距离计算,因此 Humpelstielzchen 的答案绝对是开始的地方。 - Marius