在R中的第二个数据帧中查找最近的字符串

在R中的第二个数据帧中查找最近的字符串,r,dataframe,R,Dataframe,我有一个相当大的data.frame,其中包含未更新的名称,我希望获得存储在另一个data.frame中的正确名称。 我正在使用stringdist函数查找两列之间最接近的匹配项,然后我想将新名称放入原始data.frame 我正在使用基于sapply函数的代码,如下例所示: dat1 <- data.frame("name" = paste0("abc", seq(1:5)), "value" = round(rnorm(5), 1)) dat2 <- da

我有一个相当大的
data.frame
,其中包含未更新的名称,我希望获得存储在另一个
data.frame
中的正确名称。 我正在使用
stringdist
函数查找两列之间最接近的匹配项,然后我想将新名称放入原始
data.frame

我正在使用基于
sapply
函数的代码,如下例所示:

dat1 <- data.frame("name" = paste0("abc", seq(1:5)),
          "value" = round(rnorm(5), 1))


dat2 <- data.frame("name" = paste0("abd", seq(1:5)),
                   "other_info" = seq(11:15))

dat1$name2 <- sapply(dat1$name,
                        function(x){
                          char_min <- stringdist::stringdist(x, dat2$name)
                          dat2[which.min(char_min), "name"]
                        })
dat1

dat1首先将数据帧转换为数据表:

dat1 <- data.table(dat1)
dat2 <- data.table(dat2)

这应该比sapply函数快得多。希望这有帮助

作为第一步,您可以使用
unlist(lappy)
而不是
sapply
来加速代码。尝试
RecordLinkage::levenshteinDist
而不是
stringdist::stringdist
-3x快仅使用
amatch
就可以提供相当好的性能。转换为
数据。表
只会产生很小的额外加速。非常好,它的工作方式非常出色(在内存和速度方面)。@P.Denelle太棒了!
dat1[,name2 := dat2[stringdist::amatch(name, dat2$name)]$name]