2015-03-10 2 views
0

[Обновлено ниже]Частичная строка слияния R большой набор данных

Я хотел бы объединить большой набор данных (112 мегабайт) с меньшим набором данных (< 1мг) на основе общих имен. Имена являются неточными совпадениями между обоими наборами данных. Существует ряд руководств по stackoverflow для частичного совпадения или управления большими наборами данных, но не для обоих. R имеет тенденцию замерзать, когда стандартные методы частичного согласования применяются к очень крупным наборам данных. Ниже приведены некоторые реплицируемые данные.

В большом наборе данных, имена заглавными буквами появляется, фамилия первого, с редкими суффиксами (т.е.)

JUDE, RICHARD J. MR. 

В меньшем наборе данных, они в стандартном формате «Имя Фамилия» с нет запятых или суффиксов. Каждое имя имеет связанные переменные, например, сколько денег они дали политическому кандидату или какой компании они работают.

df1$x <- c("JAYSHREE, JOHNSON D. JR.", "JAMESON, KATHERINE", "TOMMEND, LEONARD"), 
df1$p <- c(100, 200, 300) 

df2$y <- c("Leo Tommend", "Jay Johnson", "Kathy Jameson") 
df2$c <- c("Apple", "Google", "Facebook") 

Предположим, что x имеет несколько миллионов строк, у имеет несколько тысяч. Я пробовал grepl, pmatch и специализированный алгоритм из другого урока (here), но R зависает, когда я их пытаюсь. Я загрузил X -фрагмент с помощью data.table для скорости.

Я бы ошибался на стороне добавления многих строк к объединенному файловому кадру, если это помогает. Если я могу что-то сделать, чтобы ответить на этот вопрос, пожалуйста, дайте мне знать в комментариях. Спасибо за помощь

[Update]

Благодаря комментаторам, я был в состоянии уменьшить количество матчей до 20000, но это еще далеко не многие. Я включил ссылку на два файла. Эти два файла: 1). Каждый человек в США, который сделал политическое пожертвование в 2012 году и 2). имена каждого основателя Интернета.

https://www.dropbox.com/sh/x6tk1pujvfn0fnb/AACQyuICbJPR7VdDf3bbdIwwa?dl=0

Когда я применил @ код BondedDust, он значительно сократился! Но есть еще дюжины дубликатов имен. Так, например, если «Аарон» основал компанию, будут добавлены все имена «Аарон», и новые файлы предполагают, что 100 человек основали одну и ту же компанию, и каждый «Аарон» дал другому политическому деятелю.

Целью является сопоставление только уникальных примеров каждого интернет-основателя с их политическими вкладами. Мне может потребоваться добавить больше данных в алгоритм сопоставления, чем только их имена (возможности включают их местоположение, но это проблематично, потому что у многих основателей Интернета есть несколько домов)

Надеюсь, это полезно!

ответ

1

Вот выстрел: Используйте первую три буквы имени и фамилию полностью, как соответствующие критерии:

df1$xsub= gsub("^([^,]+)\\, (.{3})(.+)", "\\2 \\1", tolower(df1$x)) 
df2$ysub= gsub("^(.{3})([^ ]+) (.+)", "\\1 \\3", tolower(df2$y)) 


merge(df1,df2, by.x="xsub", by.y="ysub") 

#---------------- 
     xsub     x p    y  c 
1 kat jameson JAMESON, KATHERINE 200 Kathy Jameson Facebook 
2 leo tommend TOMMEND, LEONARD 300 Leo Tommend Apple 

Там также SOUNDEX функция (soundex), описанная в фонетике странице справки для упака: RecordLinkage что может помочь с именами, которые написаны смутно одинаковыми, например. Кэтлин и Кэти, или Джон и Джон. У меня нет опыта в сокращении ключей Soundex, но могут быть возможности использовать эту работу.

+0

Это действительно хорошее начало, но я попробовал его на своем более крупном наборе данных, и у меня появилось слишком много повторяющихся имен для обработки.Я должен был просто поделиться оригинальными документами с самого начала, я делаю, чтобы добавить больше деталей в отредактированную версию вместе со ссылкой на полный файл. – tom

+0

Вы сказали: «Я бы ошибался на стороне добавления многих строк к если это помогает ». (Я предположил, что вы имели в виду« ошибаться на стороне слишком много ».) Вы должны быть более конкретными в отношении своих целей. Вам также необходимо предложить любые дополнительные поля данных, которые могут существовать, чтобы устранить неоднозначность среди самых распространенных имен. –

+0

Справа я собираюсь переделать это в отдельном потоке и добавить более подробную информацию о данных и моих целях. Спасибо за вашу помощь. – tom

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