问题描述
我有一个40万行文件,其中包含手动输入的地址,这些地址需要进行地址编码。文件中相同地址的变化很多,因此多次对同一地址使用API调用似乎很浪费。
为减少这一点,我想减少以下五行:
Address
1 Main Street,Country A,World
1 Main St,World
1 Maine St,World
2 Side Street,World
2 Side St. Country A,World
下降到两个:
Address
1 Main Street,World
使用stringdist
包,您可以将字符串的“单词”部分分组在一起,但是字符串匹配算法不能区分数字。这意味着它将同一条街道上的两个不同的门牌号归为同一地址。
要解决此问题,我想出了两种方法:首先,尝试使用正则表达式将数字和地址手动分离到单独的列中,然后再将它们重新加入。问题在于,手动输入的地址如此之多,似乎有数百种不同的边缘情况,而且变得笨拙。
使用grouping上的这个答案和converting个单词到数字的答案,我有第二种方法来处理边缘情况,但计算量却非常昂贵。有没有更好的第三种方法?
library(gsubfn)
library(english)
library(qdap)
library(stringdist)
library(tidyverse)
similarGroups <- function(x,thresh = 0.8,method = "lv"){
grp <- integer(length(x))
Address <- x
x <- tolower(x)
for(i in seq_along(Address)){
if(!is.na(Address[i])){
sim <- stringdist::stringsim(x[i],x,method = method)
k <- which(sim > thresh & !is.na(Address))
grp[k] <- i
is.na(Address) <- k
}
}
grp
}
df <- data.frame(Address = c("1 Main Street,World","1 Main St,"1 Maine St,"2 Side Street,"2 Side St. Country A,World"))
df1 <- df %>%
# Converts Numbers into Letters
mutate(Address = replace_number(Address),# Groups Similar Addresses Together
Address = Address[similarGroups(Address,method = "lv")],# Converts Letters back into Numbers
Address = gsubfn("\\w+",setNames(as.list(1:1000),as.english(1:1000)),Address)
) %>%
# Removes the Duplicates
unique()
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)