【发布时间】:2018-01-08 16:31:08
【问题描述】:
我有一些代码想要矢量化,但我不确定如何。以下代码提供了一些示例数据,由名称和地址组成。
name <- c("holiday inn", "geico", "zgf", "morton phillips")
address <- c("400 lafayette pl tupelo ms", "227 geico plaza chevy chase md",
"811 quincy st washington dc", "1911 1st st rockville md")
source1 <- data.frame(name, address)
name <- c("williams sonoma", "mamas bbq", "davis polk", "hop a long diner",
"joes crag shack", "mike lowry place", "holiday inn", "zummer")
name2 <- c(NA, NA, NA, NA, NA, NA, "hi express", "zummer gunsul frasca")
address <- c("2 reads way new castle de", "248 w 4th st newark de",
"1100 21st st nw washington dc", "1804 w 5th st wilmington de",
"1208 kenwood parkway holdridge nb", "4203 ocean drive miami fl",
"400 lafayette pl tupelo ms", "811 quincy st washington dc")
source2 <- data.frame(name, name2, address)
此块通过 R 的原生 adist 函数计算两列文本之间的 levenshtein 区别,然后应用 min 函数。
dist.name<- adist(source1$name,source2$name, partial = TRUE, ignore.case = TRUE)
dist.address <- adist(source1$address, source2$address, partial = TRUE, ignore.case = TRUE)
min.name<-apply(dist.name, 2, min)
min.address <- apply(dist.address, 2, min)
我想做以下事情:
- 根据最小 levenshtein 距离匹配
source1$name和source2$name。 -
如果 1 的结果产生 NA,则使用 levenshtein 距离根据
source1$address和source2$address进行匹配。我尝试使用 for 循环,它适用于 1 但不适用于 2。这是我用来尝试合并两者的代码:match.s1.s2<-NULL for(i in 1:nrow(dist.name)){ for(j in 1:nrow(dist.address)){ if(is.na(match(min.name[i], dist.name[i, ]))) { s2.i <- match(min.address[j], dist.address[j,]) s1.i <- i match.s1.s2 <- match.s1.s2<-rbind(data.frame(s2.i=s2.i,s1.i=s1.i,s2name=source2[s2.i,]$name, s1name=source1[s1.i,]$name, adist=min.name[j], s1.i.address = source1[s1.i,]$address, s2.i.address = source2[s2.i,]$address),match.s1.s2) } else { s2.i<-match(min.name[i],dist.name[i,]) s1.i<-i match.s1.s2<-rbind(data.frame(s2.i=s2.i,s1.i=s1.i,s2name=source2[s2.i,]$name, s1name=source1[s1.i,]$name, adist=min.name[i], s1.i.address = source1[s1.i,]$address, s2.i.address = source2[s2.i,]$address),match.s1.s2) } } }
我的问题是它很慢,最终会生成一个太大的数据框。最终结果,数据框match.s1.s2 应该与 source1 具有相同的行数。任何建议或帮助将不胜感激。谢谢。
【问题讨论】:
-
address.full? -
@42- 刚刚编辑过的代码。应该只是最初定义的
address。
标签: r for-loop vectorization tm levenshtein-distance