[英]Find partial matching strings between two vectors in R
我正在使用R中的两个字符串向量。
第一个, 所有者 ,包含大约100,000个元素,如下所示:
> proprietor
[1] "GERALD RICA LIMITED"
[2] "EUROMASTER STUDIO SRL"
[3] "CENTRE D'ECHANGES INTERNATIONAUX (CEI)"
[4] "RONTEC SERVICE STATION 1A LIMITED"
[5] "MOORGARTH PROPERTIES (LUXEMBOURG) S.A.R.L"
[6] "BEAVRON INVESTMENTS LIMITED"
[7] "MITRALI LIMITED"
另一个名为name ,包含大约700,000个类似元素:
> name
[1] "MULTIPOINT HOLDINGS LIMITED"
[2] "NYASA PROPERTY LIMITED"
[3] "WHITE LODGE HOLDINGS LIMITED"
[4] "MULTIPOINT HOLDINGS LIMITED"
[5] "MULTIPOINT HOLDINGS LIMITED"
[6] "JBL INVESTMENT LIMITED"
[7] "DIMBLEBY LIMITED"
[8] "LIDL U.K. GMBH"
考虑到可能存在一些错别字或例如“ LIMITED”之类的单词也可以写成“ LTD”,我想知道所有人的名字也有名字 。
我已经尝试过的:
proprietor %in% name
返回一个空元素,我知道不是这样
intersect(proprietor, name)
不起作用,因为我的向量中有重复项
主要是,我尝试使用agrep()
进行循环以允许部分匹配:
for (i in 1:97034) {
if (is.null(agrep(proprietor[i], name, max.distance=0.1, value=TRUE, useBytes=TRUE, costs=NULL, ignore.case=TRUE))=="TRUE") {
test[i] <- 1
} else {
test[i] <- agrep(proprietor[i], name, max.distance=0.1, value=TRUE, useBytes=TRUE, costs=NULL, ignore.case=TRUE)
}
}
它返回错误“ regcomp错误:'内存不足'”。 我是从R开始的,所以1)我可以看到此循环不是最简单的方法2)我没有得到如何纠正内存不足错误的方法。
任何有关如何解决此问题的建议将不胜感激!
我将使用功能adist
从包装stringdist
。
最小的工作示例:
创建一个无意义单词的向量,并将其称为:
a <- c("gkhk", "ololsol", "tyuil", "tyuio", "etytyuli")
修改一些单词(或多或少的修饰度),并将其称为向量b:
b <- c("gwrwkhk", "olseotyuioplsol", "thsyuil", "tasyuio", "etytyuli")
然后计算元素之间的距离
yourdistance <- adist(x = a, y = b, ignore.case = TRUE)
yourdistance
将是一个计算元素之间距离的矩阵。
[,1] [,2] [,3] [,4] [,5]
[1,] 3 15 7 7 8
[2,] 7 8 6 7 7
[3,] 7 10 2 3 5
[4,] 7 10 3 2 5
[5,] 8 11 5 5 0
例如,[5,]中的“ etytyuli”和b [,5]中的“ etytyuli”之间的距离将为0,因为我没有将该字符串从a修改为b。
一旦有了这个矩阵,就可以决定什么对您足够“接近”,并仅选择那些元素。 您还可以使用参数cost进行操作,该参数允许您为插入,删除或替换提供不同的成本。
您可能想了解更多有关此的信息:
https://www.r-bloggers.com/fuzzy-string-matching-a-survival-skill-to-tackle-unstructured-information/
希望能帮助到你。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.