我有一个非常大的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
但是,考虑到data.frame
的大小,此代码太慢了。
是否有更优化的替代解决方案,例如使用data.table
R包?
答案 0 :(得分:1)
首先将数据帧转换为数据表:
dat1 <- data.table(dat1)
dat2 <- data.table(dat2)
然后使用&#34;:=&#34;和&#34; amatch&#34;命令创建一个大致匹配两个名称的新列:
dat1[,name2 := dat2[stringdist::amatch(name, dat2$name)]$name]
这应该比sapply函数快得多。希望这有帮助!