2015-04-10 6 views
0

Я работаю над большим набором данных, который имеет имена клиентов, каждый из которых должен быть проверен с помощью главного файла с правильными именами (300 КБ), и если он сопоставлен, добавьте имя основного файла для имен файла клиента как нового значения столбца. My prev Question worked for small data setsR: Нечеткое логическое совпадение имени

Оба клиента & Master файл был очищен с помощью tm и попытался другая логика, но работает только на небольшом наборе данных при применении огромных файлов не является эффективным, сопоставление с образцом здесь не поможет мое мнение вызывает никаких имен не приходит с точным рисунком Файл

Кас

1   chang chun petrochemical 
2    chang chun plastics 
3      church dwight 
4  citrix systems asia pacific 
5   cnh industrial services srl 
6     conoco phillips 
7     conocophillips 
8     dfk laurence varnay 
9      dtz worldwide 
10 electro motive maintenance operati 
11    enterasys networks 
12     esso resources 
13       expedia 
14       expedia 
15  exponential interactive aust 
16  exxonmobil asia pacific pte 
17 exxonmobil chemical asia pac div 
18      exxonmobil png 
19   formula world championship 
20  fortitech asia pacific sdn bhd 

Мастер

1      chang chun group 
2      church dwight 
3  citrix systems asia pacific 
4     cnh industrial nv 
5      conoco phillips 
6     dfk laurence varnay 
7     dtz group zealand 
8       caterpillar 
9     enterasys networks 
10     exxon mobil group 
11      expedia group 
12  exponential interactive aust 
13   formula world championship 
14  fortitech asia pacific sdn bhd 
15    frhi hotels resorts 
16   gardner denver industries 
17 glencore xstrata international plc 
18       grace 
19      incomm nz 
20    information resources 
21     kbr holdings llc 
22      kennametal 
23       komatsu 
24  leonhard hofstetter pelzdesign 
25   communications corporation 
26    manhattan associates 
27        mattel 
28      mmg finance 
29      nokia oyj group 
30       nortek 

Я попытался с помощью этого простого цикла

for (i in 1:100){ 
    result$x[i] = agrep(result$ICIS_Cust_Names[i], result1$Master_Names, value = TRUE, max = list(del = 0.2, ins = 0.3, sub = 0.4)) 
    #result$Y[i] = agrep(result$ICIS_Cust_Names[i], result1$Master_Names, value = FALSE, max = list(del = 0.2, ins = 0.3, sub = 0.4)) 
} 

* результат *

1   chang chun petrochemical        <NA> NA 
2    chang chun plastics        <NA> NA 
3      church dwight     church dwight 2 
4  citrix systems asia pacific citrix systems asia pacific 3 
5   cnh industrial services srl       <NA> NA 
6     conoco phillips     church dwight 2 
7     conocophillips        <NA> NA 
8     dfk laurence varnay       <NA> NA 
9      dtz worldwide    church dwight 2 
10 electro motive maintenance operati       <NA> NA 
11    enterasys networks        <NA> NA 
12     esso resources     church dwight 2 
13       expedia        <NA> NA 
14       expedia       <NA> NA 
15  exponential interactive aust    church dwight 2 
16  exxonmobil asia pacific pte       <NA> NA 
17 exxonmobil chemical asia pac div       <NA> NA 
18      exxonmobil png    church dwight 2 
19   formula world championship       <NA> NA 
20  fortitech asia pacific sdn bhd 

опробованы lapply но не использовать, так как вы можете заметить, мой мастер-файл большой и несколько раз я получить ошибку длины строк не соответствует!

mm<-dt[lapply(result, function(x) levenshteinDist(x ,lapply(result1, function(x) x)))] 

#using looping stat. for checking each cus name with all the master names 
for(i in seq(nrow(result))) 
    { 
     if((levenshteindist(result[i],lapply(result1, function(x) String(x))))==0) 
     sprintf("%s", x) 
    } 

Какой метод был бы лучше для этого? similar to my Q but not much helpfull я referd несколько Q от STO

это может быть наивным, но при применении с огромными наборами данных, он неправильно себя ведет, может кто-нибудь знаком с R может исправить меня с указанным кодом для levenshteinDist

код:

#check with each value of master file and if matches more than .90 then return master value. 


for(i in seq(1:nrow(gr1)) 
{ 
    for(j in seq(1:nrow(gr2)) 
    { 
    gr1$jar[i,j]<-jarowinkler(gr1$ICIS_Cust_Names[i],gr2$Master_Names[j]) 
    if(gr1$jar[i,j]>.90) 
     gr1$res[i] = gr2$Master_Names[j] 

    } 
} 
#Please let know if there is any minute error with this code 

Пожалуйста, если кто-то работал с такими данными в R, пожалуйста, помогите!

+0

Вы это видели: http://stackoverflow.com/questions/27975705/compare-strings-for-an-approximate-match/27975870 # 27975870 - он тоже не работает отлично, но это нормально (16/20 правильно, без каких-либо настроек). – thelatemail

+0

да, но это сильно отличается от моего вопроса, я тоже пробовал с «adist», но лучше бы я подумал, может ли я решить его через 'levenshteinDist'. Я полагаю, что моя логика для кода выше, но есть небольшая ошибка с циклом, если вы можете исправить меня – KRU

+0

Я применил для небольших наборов данных, которые абсолютно идеальны только для небольших данных, огромные наборы данных не работают – KRU

ответ

0

достигли частичного результата на

код:

df$result<-data.frame(df$Cust_Names, df$Master_Names[max.col(-adist(df$Cust_Names,df$Master_Names))]) 
Смежные вопросы