2010-02-09 15 views
9

OPISłączenia dwóch ramek danych za pomocą Fuzzy/Przybliżona łańcuch pasujący w R

że dwa zbiory danych z informacjami, które trzeba połączyć. Jedynymi wspólnymi polami, które mam, są ciągi, które nie pasują idealnie, oraz pole numeryczne, które może być zasadniczo różne.

Jedynym sposobem na wyjaśnienie problemu jest pokazanie danych. Oto a.csv i b.csv. Próbuję połączyć B z A.

Istnieją trzy pola w B i cztery w A. Nazwa firmy (tylko plik A), nazwa funduszu, klasa aktywów i aktywa. Do tej pory mój nacisk został położony na próbując dopasować nazwy Funduszu poprzez zastąpienie słowa lub części struny do tworzenia dokładnych wyników, a następnie przy użyciu:

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") 

Jednak to tylko doprowadza mnie do około 30% dopasowania. Resztę muszę zrobić ręcznie.

Aktywa to pole liczbowe, które nie zawsze jest poprawne i może się znacznie różnić, jeśli fundusz ma niskie aktywa. Klasa zasobów jest polem łańcucha, które jest "ogólnie" takie samo w obu plikach, jednak istnieją rozbieżności.

Dodanie do komplikacji są różne serie funduszy, B. pliku Na przykład:

AGF kanadyjski Wartość

AGF kanadyjski Value-D

W tych przypadkach, Muszę wybrać ten, który nie jest seryjny, lub wybrać ten, który nazywa się "A", "-A" lub "Doradca" jako mecz.

PYTANIE

Co byś powiedział, jest najlepszym rozwiązaniem? To ćwiczenie jest czymś, co muszę wykonywać co miesiąc, a ręczne dopasowywanie ich jest niezwykle czasochłonne. Przykłady kodu byłyby instrumentalne.

POMYSŁY

Jedną z metod, która myślę, że może pracować jest normalizowanie sznurki na podstawie pierwszego wielka litera każdego słowa w ciągu. Ale nie byłem w stanie wymyślić, jak to zrobić, używając R.

Inną rozważaną przeze mnie metodą było utworzenie indeksu wyników na podstawie kombinacji aktywów, nazwy funduszu, klasy aktywów i firmy. Ale znowu nie jestem pewien, jak to zrobić z R. Lub, jeśli o to chodzi, jeśli to nawet możliwe.

Przykłady kodu, komentarzy, myśli i kierunku są bardzo mile widziane!

+1

Jeśli mówimy o dopasowaniu ciągów, to '? Agrep' (w pakiecie podstawowym). – Marek

+1

Byłoby wspaniale, gdyby można było umieścić część danych w poście, aby móc korzystać z przykładu kilka lat po opublikowaniu. Dzięki. – Jochem

+0

rzeczywiście kilka lat później, a dane nie są dostępne. –

Odpowiedz

2

dopasowanie Przybliżony ciąg nie jest dobrym pomysłem, ponieważ niepoprawne mecz by unieważnić całą analizę. Jeśli nazwy z każdego źródła są za każdym razem takie same, to tworzenie indeksów wydaje mi się najlepszą opcją. Można to łatwo zrobić w R:

Załóżmy, że mamy dane:

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

zbudować indeks nazw dla każdego źródła pewnym momencie, być może przy użyciu pmatch itd. Jako punkt wyjścia, a następnie sprawdzanie ręcznie.

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)) 

Następnie dla każdego uruchomienia seryjnej przy użyciu:

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

co dałoby nam:

idx name.x price  name.y qty 
1 1 Ace 10 Ace Co. 9 
2 2 Bayes 13 Bayes Inc. 99 
+2

Problem jest większy, gdy nazwy są brudniejsze niż to. Powiedz, kiedy pierwsze słowo może być krótkie lub nie, i czy pozostałe słowa mogą być niedokładne. Ta krótkowzroczność nie jest spójna w obrębie jednej nazwy lub w nazwach. – Jay

7

Jedna szybka sugestia: spróbuj zrobić dopasowanie na różnych polach oddzielnie przed użyciem scalania. Najprostszym podejściem jest funkcja pmatch, chociaż R nie ma niedoborów funkcji dopasowywania tekstu (na przykład agrep).Oto prosty przykład:

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

Dla własnego zbioru danych, to pasuje do wszystkich nazw funduszy z 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 

Po utworzeniu mecze, można łatwo połączyć je ze sobą przy użyciu tych zamiast.

+0

Dzięki Shane, twoje sugestie są zawsze pomocne - przyjrzę się tym dwóm i dam ci znać, jak to się udało. –

+0

Tak, zdecydowanie, świetne wskazówki Shane. – Jay

+3

Problem jest większy, gdy nazwy są brudniejsze niż to. Powiedz, kiedy pierwsze słowo może być krótkie lub nie, i czy pozostałe słowa mogą być niedokładne. Ta krótkowzroczność nie jest spójna w obrębie jednej nazwy lub w nazwach. – Jay

1

Jestem również lokalnym mieszkańcem Kanady, rozpoznaję nazwy funduszy.

Jest to trudne, ponieważ każdy z dostawców danych wybiera swój własny formularz dla poszczególnych nazw funduszy. Niektórzy używają różnych struktur, takich jak wszystkie kończące się w każdym Funduszu lub Klasie, inne są wszędzie. Każdy wydaje się również wybierać własne krótkie formy, a te zmieniają się regularnie.

Dlatego tak wielu ludzi jak ty robi to ręcznie, regularnie. Niektóre firmy konsultingowe wystawiają indeksy, które łączą różne źródła, nie wiedząc, czy wybrałeś tę trasę?

Jak zauważyli Shane i Marek, jest to pasujące zadanie bardziej niż łączenie proste. Wiele firm boryka się z tym problemem. Jestem w trakcie pracy nad tym ...

Jay

+0

To frustrujące. Jestem naprawdę zaskoczony, że nie mają przypisanych im kodów. Nomenklatura nie jest w ogóle znormalizowana, a nawet klasy aktywów nie pasują do siebie od jednego dostawcy do drugiego w tym samym roku, nie mówiąc już o tym samym miesiącu.Jeśli pracujesz nad tym, chciałbym okazję omówić to bardziej szczegółowo: brandon AT bertelsen dot ca is me. –

+1

Zdecydowanie jest, niektóre mają kody, ale są one indentyfikatorami tylko w ich własnych systemach ... Chciałbym, aby opór mógł także dyskutować i współpracować. Niedługo wyślemy ci maila. – Jay

+1

Wygląda na to, że mogę tylko komentować moją własną odpowiedź ... , więc zgadzam się z jmoyem, należy skonstruować indeks (id), który posłuży do przyłączenia się do różnych źródeł. Kluczem jest tworzenie tych indeksów;) niektóre standardowe elementy działają, a niektóre nie. To trudne. Czy są tam doświadczeni integratorzy danych, którzy być może wiedzą coś, czego niektórzy z nas nie wiedzą? Przybliżone dopasowanie i wszystkie prototypy, które są najbardziej zautomatyzowanym sposobem, w jaki znalazłem, aby zająć się takimi problemami. – Jay

Powiązane problemy