Сравнение Fuzzy R - PullRequest
       27

Сравнение Fuzzy R

0 голосов
/ 01 ноября 2018

У меня есть два набора данных, в наборе данных df1 есть столбец с названиями компаний, зарегистрированных в нашей CRM, и еще один столбец с именем менеджера по продажам. В наборе данных df2 есть столбец с названиями компаний, которые посетили ИТ-мероприятие.

Набор данных df2, поскольку он был введен участниками вручную, был написан с орфографическими ошибками, сокращениями и т. Д. То есть схожими названиями названий компаний, зарегистрированных в CRM.

Таким образом, цель состоит в том, чтобы сравнить названия компаний, которые посетили событие в наборе данных df2, с именами компаний, зарегистрированных в наборе данных df1, и назначить эти сравнения менеджеру по продажам. Конечно, имена, которые не найдены или имеют очень отдаленное сравнение, должны иметь значение NA для продавца.

Я новичок в R и пробую разные вещи с небольшим успехом.

Не могли бы вы помочь мне создать этот скрипт?

Ниже приведен пример:

                 df1                                 df2  
    |----------------|----------------|       |----------------|
    |    Company     |  Sales Manager |       | Company Event  |
    |----------------|----------------|       |----------------|
    |Customer 1 SA   |Erik            |       |Customer 1      |
    |Customer 2 S\A  |Selma           |       |Customer 1 SA.  |
    |Customer 3 Ltda.|Juca            |       |Customer2       |
    |Customer 4      |Batista         |       |cUSTOIMER 3     |
    |----------------|----------------|       |Customer 10     |
                                              |----------------|

Окончательный ожидаемый результат - получить еще один df со скрещенными данными.

                             matched df  
        |----------------|----------------|----------------|
        | Company Event  |    Company     | Sales Manager  |
        |----------------|----------------|----------------|
        |Customer 1      |Customer 1 SA   |Erik            |
        |Customer 1 SA.  |Customer 1 SA   |Erik            |
        |Customer2       |Customer 2 S\A  |Selma           |
        |cUSTOIMER 3     |Customer 3 Ltda.|Juca            |
        |Customer 10     |NA              |NA              |
        |----------------|----------------|----------------|

1 Ответ

0 голосов
/ 01 ноября 2018

Следующее должно работать. Это включает в себя очистку имен, получение минимальных расстояний, а затем получение информации менеджера по продажам.

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

...