2015-01-27 2 views
2

У меня есть 2 набора данных с более чем 100K строк. Я хотел бы объединить их на основе нечеткой строки, соответствующей одному столбцу («название фильма»), а также использовать дату выпуска. Я предоставляю образец из обоих наборов данных ниже.Нечеткое совпадение строк в r

набор данных-1

itemid userid rating  time        title release_date 
99991 1673 835  3 1998-03-27        mirage   1995 
99992 1674 840  4 1998-03-29       mamma roma   1962 
99993 1675 851  3 1998-01-08      sunchaser, the   1996 
99994 1676 851  2 1997-10-01     war at home, the   1996 
99995 1677 854  3 1997-12-22      sweet nothing   1995 
99996 1678 863  1 1998-03-07       mat' i syn   1997 
99997 1679 863  3 1998-03-07       b. monkey   1998 
99998 1680 863  2 1998-03-07      sliding doors   1998 
99999 1681 896  3 1998-02-11      you so crazy   1994 
100000 1682 916  3 1997-11-29 scream of stone (schrei aus stein)   1991 

набор данных - 2

itemid userid rating  time         title release_date 
1 2844 4477  3 2013-03-09 fantã´mas - 〠l'ombre de la guillotine   1913 
2 4936 8871  4 2013-05-05        the bank   1915 
3 4936 11628  3 2013-07-06        the bank   1915 
4 4972 16885  4 2013-08-19     the birth of a nation   1915 
5 5078 11628  2 2013-08-23        the cheat   1915 
6 6684 4222  3 2013-08-24        the fireman   1916 
7 6689 4222  3 2013-08-24       the floorwalker   1916 
8 7264 2092  4 2013-03-17        the rink   1916 
9 7264 5943  3 2013-05-12        the rink   1916 
10 7880 11628  4 2013-07-19        easy street   1917 

Я посмотрел на 'agrep', но она соответствует только одной строке за раз. Функция «stringdist» хороша, но вам нужно запустить ее в цикле, найти минимальное расстояние, а затем перейти к дальнейшей прецессии, что очень трудоемко, учитывая размер наборов данных. Строки могут иметь опечатки и специальные символы, из-за которых требуется нечеткое согласование. Я осмотрелся и нашел методы «Лененштейна» и «Яро-Винклера». Чем позже я прочитаю, тем лучше, когда у вас есть опечатки в строках.

В этом случае только нечеткое совпадение может не обеспечивать хороших результатов, например, название фильма «игрушечная история» в одном наборе данных может быть сопоставлено с «игрушечным рассказом 2» в другом, что неверно. Поэтому мне нужно рассмотреть дату выпуска, чтобы убедиться, что выбранные фильмы уникальны.

Я хочу знать, есть ли способ достичь этой задачи без использования цикла? хуже, если я должен использовать цикл, как я могу заставить его работать эффективно и как можно быстрее.

Я пробовал следующий код, но он обработал огромное количество времени.

for(i in 1:nrow(test)) 
    for(j in 1:nrow(test1)) 
    { 

    test$title.match <- ifelse(jarowinkler(test$x[i], test1$x[j]) > 0.85, 
         test$title, NA) 
    } 

тест - содержит 1682 уникальных имен фильма конвертируются в нижнем регистре test1 - содержит 11451 уникальных имен фильма конвертируются в нижнем регистре

Есть ли способ, чтобы избежать для петель и заставить его работать быстрее?

+2

не отправляйте свой вопрос. запустите bounty – rawr

ответ

1

Как насчет этого подхода, чтобы переместить вас вперед? Вы можете настроить степень соответствия с 0,85 после просмотра результатов. Затем вы можете использовать dplyr для группировки по совпадающему названию и суммировать, вычитая даты выпуска. Любые нули означают одну и ту же дату выпуска.

dataset-1$title.match <- ifelse(jarowinkler(dataset-1$title, dataset_2$title) > 0.85, dataset-1$title, NA) 
+0

Одна вещь, которую я хотел бы попросить об этом методе. На странице справки говорится, что массивы или векторы должны иметь одинаковую длину или более короткая будет переработана. Можно ли использовать метод для наборов данных неравного размера? Один набор данных содержит ровно 100K строк, а другой содержит 117K строк. Уникальные названия - 1682 в одном наборе данных и 11451 в другом. Можете ли вы предложить способ обойти эту ситуацию? Я попытался запустить функцию на неравных наборах данных и дал ошибку, как ожидалось. – syebill

+0

Я предполагаю, что вашему коду также потребуется цикл, поскольку в противном случае он будет соответствовать только элементу-i элементу-i в обоих наборах данных. Я ищу, чтобы пройти все заголовки во втором наборе данных, чтобы найти подходящее значение, которое снова требует двух для циклов. Есть ли у вас какие-либо идеи о том, как сделать это с помощью векторизации или может быть sapply/lapply? – syebill

+0

Попробуйте ввести код и опубликуйте его как Изменить на свой вопрос. – lawyeR

Смежные вопросы