Разделите данные по количеству строк, нечетко сопоставьте их с другим набором данных, а затем объедините все нечеткие совпадения вместе в R

#r #dataframe #inner-join #fuzzyjoin

#r #фрейм данных #внутреннее соединение #пушистое соединение

Вопрос:

Я пытаюсь нечетко сопоставить строки в разных кадрах данных/таблицах данных на основе имени переменной компании. Я сопоставил большую часть из них с помощью стандартных соединений и использования некоторых регулярных выражений для удаления слов (таких как Limited, Ltd) и т. Д., Но у меня осталось число, которое я хотел бы сопоставить с помощью нечеткого объединения (например, если в одном наборе данных есть орфографическая ошибка, которую я не могу поймать иначе).

Наборы данных, которые я пытаюсь объединить, очень большие, поэтому мне нужно разделить самые маленькие на более управляемые куски (например, 200 строк), затем в идеале я бы нечетко сопоставил их (сохранив только самые близкие совпадения), а затем объединил все ответы. Например, если у меня есть следующие два набора данных (значительно уменьшенные в размере):

 company_names1 lt;- c("ABC Company", "Jelly Jelly (fka Jelly Jelly)", "Forest Rovers", "Table Manufacturers") company_revenue lt;- c(200, 100, 84, 940) company_profit lt;- (180, 9, -40, 450) df1 lt;- c(company_names1, company_revenue, company_profit) company_names2 lt;- c("ABCs Company", "Cars etc", "Jelly (Jelly) Company", "Forest Green Rovers", "Palm Trees for all inc", "Terrific Turtles", "Big Table Manufacturers") city lt;- c("Berlin", "London", "Paris", "London", "San Diego", "Glasgow", "Denver") df2 lt;- c(company_names2, city)  

В этом случае я хотел бы разделить df1 на меньшее количество строк, а затем попытаться нечетко сопоставить имена компаний 1 и имена компаний 2. Я скопировал код, который знаю ниже, но любые другие лучшие способы сделать это будут приветствоваться!

 join lt;- expand.grid(name1 = df1$company_names1, name2 = df2$company_names2, stringsAsFactors = FALSE) join lt;- join %gt;% group_by(name1) %gt;%  mutate(match_score = stringdist(name1, name2, method='jw')) %gt;%  arrange(name1, match_score) %gt;%  slice(1) %gt;%  ungroup %gt;%  filter(match_score lt; 0.2 amp; match_score gt; 0)  

(Я пытался использовать пакет fuzzyjoin, но для меня он работает медленнее…)

Есть ли способ использовать функцию для разделения df1 на меньшие фреймы данных в зависимости от количества строк, сделать вышеописанное, а затем объединить/объединить результат всех этих «объединенных» фреймов данных в один фрейм данных за один раз?

Пожалуйста, дайте мне знать, могу ли я предоставить какие-либо другие подробности по этому поводу.

Комментарии:

1. Каковы ваши N здесь, сколько имен (N1) вам нужно для нечеткого соответствия и скольким компаниям (N2) вы соответствуете? Независимо от того, как вы его структурируете, это количество комбинаций N1*N2, поэтому оно медленное. Разделение заставит его работать, но не уверен, что это вообще увеличит вашу скорость.

2. Сначала я пытаюсь сопоставить компании Великобритании, что составляет примерно 200 000 х 5000 названий (хотя для других стран это может означать больше с обеих сторон). Методы, которые я знаю для нечеткого сопоставления, не работают, так как возникает ошибка при выделении такого большого объекта или нехватке места. Поэтому я надеялся, что разделение 5000 имен уменьшит размер любой матрицы, которую он должен создать, отфильтрует ее и сначала удалит несоответствия, избегая ошибок, которые я получил.

3. Да, разделение избавит вас от проблем с пространством. Я предполагаю, что это остаток, и вы уже удалили все точные совпадения? Если нет, то это должно быть вашим первым шагом.

4. Правильно, это остаток, так как я удалил точные совпадения/совпадения, удалив общие слова (ограничено и т. Д.).