Следующее должно работать. Это включает в себя очистку имен, получение минимальных расстояний, а затем получение информации менеджера по продажам.
library(stringdist)
# declare data ------------------------------------------------------------
Company <- c("Customer 1 SA" ,"Customer 2 S/A", "Customer 3 Ltda.", "Customer 4")
SalesManager <- c("Erik", "Selma", "Juca", "Batista")
CompanyEvent <- c("Customer 1", "Customer 1 SA.", "Customer2" , "cUSTOIMER 3", "Customer 10")
df1 <- data.frame(Company, SalesManager, stringsAsFactors = F)
df2 <- data.frame(CompanyEvent, stringsAsFactors = F)
# clean 'dirty' names -----------------------------------------------------
df1$cleannames <- gsub("S/A", "", df1$Company)
df1$cleannames <- gsub("SA", "", df1$cleannames)
df1$cleannames <- gsub("Ltda.", "", df1$cleannames)
df1$cleannames <- gsub(" ", "", df1$cleannames)
df1$cleannames <-tolower(df1$cleannames)
df2$cleannames <- gsub("S/A", "", df2$CompanyEvent)
df2$cleannames <- gsub("SA", "", df2$cleannames)
df2$cleannames <- gsub("Ltda.", "", df2$cleannames)
df2$cleannames <- gsub(" ", "", df2$cleannames)
df2$cleannames <-tolower(df2$cleannames)
# Get the closest matches and distances -----------------------------------
df2$closestentry <- apply(df2,1, function(x) df1$cleannames[which.min(stringdist(x["cleannames"], df1$cleannames ))] )
df2$levdistance <- apply(df2,1, function(x) min(stringdist(x["cleannames"], df1$cleannames )))
#Get sales mgr data using closest matches
df2$salesmgr <- df1$SalesManager[match(df2$closestentry,df1$cleannames )]
df2
> df2
CompanyEvent cleannames closestentry levdistance salesmgr
1 Customer 1 customer1 customer1 0 Erik
2 Customer 1 SA. customer1. customer1 1 Erik
3 Customer2 customer2 customer2 0 Selma
4 cUSTOIMER 3 custoimer3 customer3 1 Juca
5 Customer 10 customer10 customer1 1 Erik
Нечеткое совпадение строк ... ну, нечетко, так что у вас могут быть случаи, которые не соответствуют вашим ожиданиям, однако вы должны быть в порядке после некоторой настройки (здесь, например, добавляется customer10
в df1
)
То, что я имею в виду здесь под расстоянием - это расстояние до строки, см. ?stringdist