在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]