我有两个列表,一个是客户列表,另一个是客户编号列表。我想匹配客户名称并返回其客户编号。
在两个列表之间匹配Customer字符串的最佳方法是什么?
请注意,名称可能不完全匹配,因此'公司名称公司' /'公司注册' /'公司名称公司' /' COMPANYNAME Inc' ...
是否有任何能提供最佳匹配的命令?
由于 加文
答案 0 :(得分:1)
为了匹配不完全相同的字符串,我将指向stringdist{}
包。特别是,该包中的amatch
函数应该会有所帮助。这是文档的链接:
https://cran.r-project.org/web/packages/stringdist/stringdist.pdf
某些能够重现数据帧小版本的代码会很有用,但我创建了这么短的代码。它首先根据您列出的几个名称创建两个字符串。然后我从中创建了两个数据帧。
install.packages("stringdist")
library(stringdist)
names_1 <- c("Apple Ltd", "PearLtd", "Banana Co Ltd")
names_2 <- c("Pear Limited", "Banana ltd", "Appl Ltd")
cust_num <- c(10001, 10002, 10003)
df_1 <- data.frame(names_1)
df_2 <- data.frame(names_2, cust_num)
best_match <- na.omit(amatch(df_2$names_2, df_1$names_1, maxDist = 4))
df_2$cust_num[best_match]
最后一行只输出两个列表中找到的公司名称的客户ID矢量。
文档将解释amatch
的参数,但是您会遇到maxDist
的问题 - 设置得太低,您的公司名称也不匹配。设置得太高,你会得到误报。您可以看到在此示例中发生的情况,其中只返回两个ID,因为“Pear Limited”距离“PearLtd”太远。
答案 1 :(得分:0)
这是一个非常深刻和复杂的主题。除了Matt Sandgren的回答之外,您可能还想查看内置于R的adist
函数,并给出Levenshtein距离IIRC。如果你是字符串匹配的新手,你可能还想尝试一些其他的东西:
如果你只是想对一些比赛进行排名,这是一回事,但如果假阴性/肯定是一个问题那么这就是另一个问题!取决于问题...