Слияние двух Кадров данных с помощью Нечеткого/Приблизительного Сопоставления строк в R

ОПИСАНИЕ

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

Единственный способ объяснить проблему состоит в том, чтобы показать Вам данные. Вот a.csv и b.csv. Я пытаюсь объединить B с A.

Существует три поля в B и четыре в A. Название компании (Регистрируют Единственное), Название фонда, Класс активов и Активы. До сих пор мой фокус был на попытке соответствовать Названиям фонда путем замены слов или частей строк для создания точных совпадений и затем использования:

a <- read.table(file = "http://bertelsen.ca/R/a.csv",header=TRUE, sep=",", na.strings=F, strip.white=T, blank.lines.skip=F, stringsAsFactors=T) 
b <- read.table(file = "http://bertelsen.ca/R/b.csv",header=TRUE, sep=",", na.strings=F, strip.white=T, blank.lines.skip=F, stringsAsFactors=T)
merge(a,b, by="Fund.Name") 

Однако это только приносит мне приблизительно к 30%-му соответствию. Остальные я должен сделать вручную.

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

Добавление к сложности является другой серией фондов в Файле B. Например:

Канадское значение AGF

Ценный канадец AGF

В этих случаях я должен выбрать тот, который не сомкнут ряды, или выберите тот, который называют "A", "-A", или "Советником" как соответствие.

ВОПРОС

Что было бы Вы говорить быть лучшим подходом? Это осуществление - что-то, что я должен сделать ежемесячно, и соответствие им вручную является невероятно трудоемким. Примеры кода способствовали бы.

ИДЕИ

Один метод, что я думаю, может работать, нормализует строки на основе первой капитализированной буквы каждого слова в строке. Но я не смог выяснить, как вытянуть это от использования R.

Другой метод, который я рассмотрел, создавал индекс соответствий на основе комбинации активов, названия фонда, класса активов и компании. Но снова, я не уверен, как сделать это с R. Или, в этом отношении, если это даже возможно.

Примеры кода, комментариев, мыслей и направления значительно ценятся!

15
задан pnuts 16 November 2015 в 22:24
поделиться

3 ответа

Приблизительное сопоставление строк - не самая лучшая идея, так как неправильное сопоставление приведет к недействительности всего анализа. Если имена из каждого источника каждый раз одни и те же, то создание индексов кажется мне лучшим вариантом. Это легко сделать в R:

Предположим, у вас есть данные:

a<-data.frame(name=c('Ace','Bayes'),price=c(10,13))
b<-data.frame(name=c('Ace Co.','Bayes Inc.'),qty=c(9,99))

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

a.idx<-data.frame(name=c('Ace','Bayes'),idx=c(1,2))
b.idx<-data.frame(name=c('Ace Co.','Bayes Inc.'), idx=c(1,2))

Затем для каждого прогона объедините данные, используя:

a.rich<-merge(a,a.idx,by="name")
b.rich<-merge(b,b.idx,by="name")
merge(a.rich,b.rich,by="idx")

Что даст нам:

  idx name.x price     name.y qty
1   1    Ace    10    Ace Co.   9
2   2  Bayes    13 Bayes Inc.  99
2
ответ дан 1 December 2019 в 03:34
поделиться

Одно быстрое предложение: попробуйте выполнить сопоставление в разных полях по отдельности, прежде чем использовать слияние. Самый простой подход - использовать функцию pmatch , хотя в R нет недостатка в функциях сопоставления текста (например, comparep ). Вот простой пример:

pmatch(c("med", "mod"), c("mean", "median", "mode"))

Для вашего набора данных это соответствует всем именам фондов из a :

> nrow(merge(a,b,x.by="Fund.Name", y.by="Fund.name"))
[1] 58
> length(which(!is.na(pmatch(a$Fund.Name, b$Fund.name))))
[1] 238

Создав совпадения, вы можете легко объединить их вместе, используя вместо этого.

8
ответ дан 1 December 2019 в 03:34
поделиться

Я тоже местный житель Канады, узнаю названия фондов.

Это непросто, поскольку каждый из поставщиков данных выбирает свою собственную форму для названий отдельных фондов. Некоторые используют разные структуры, например, все заканчиваются либо на Fund, либо на Class, другие - на все подряд. Каждый из них, похоже, также выбирает свои собственные краткие формы, которые регулярно меняются.

Вот почему многие люди, такие как вы, делают это вручную на регулярной основе. Некоторые консалтинговые фирмы составляют списки индексов для связи различных источников, не знаю, исследовали ли вы этот путь.

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

Джей

0
ответ дан 1 December 2019 в 03:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: