2010-02-09 75 views
9

說明合併兩個數據幀使用模糊/近似串匹配中的R

我有信息的兩個數據集,我需要合併。我唯一的共同領域是不完美匹配的字符串和可能大不相同的數字字段

解釋問題的唯一方法是向您顯示數據。這裏是a.csvb.csv。我試圖將B合併爲A.

B有三個字段,A有四個公司名稱(僅限文件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加拿大價值d

在這些情況下,我必須選擇一個未被選中的選項,或選擇一個名爲「A」,「-A」或「Advisor」的選項作爲比賽。

問題

你會說什麼是最好的方法?這個練習是我每月必須做的事情,手動匹配它是非常耗時的。代碼的例子將是有用的。

IDEAS

一種方法,我覺得可以合作,開發基於字符串中每個單詞的第一個大寫字母被標準化的字符串。但我一直未能弄清楚如何使用R來解決這個問題。

我考慮的另一種方法是根據資產,基金名稱,資產類別和公司的組合來創建匹配指數。但是,我不知道如何用R來做到這一點。或者,就此而言,如果甚至可能的話。

代碼,評論,想法和方向的例子非常感謝!

+1

如果我們談論字符串匹配,那麼'?agrep'(在基礎包中)。 – Marek 2010-02-09 20:40:38

+1

如果您可以將數據作爲帖子的一部分,那麼我們可以在發佈幾年後使用該示例。謝謝。 – Jochem 2012-12-09 21:12:07

+0

確實在幾年後,數據不存在 – 2016-05-12 10:55:44

回答

2

近似字符串匹配是不是一個好主意,因爲不正確的比賽將整個分析無效。如果每個源的名稱每次都是相同的,那麼構建索引似乎也是我的最佳選擇。這是很容易在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

問題更多時,名稱更骯髒,然後。說出第一個單詞是否可能短格式化,以及何時其餘單詞可能會或可能不會被簡化。這種短格式在單個名稱或名稱內部不一致。 – Jay 2010-02-14 15:32:49

7

一個快速建議:嘗試在使用合併之前分別在不同的字段上進行匹配。儘管R不缺少文本匹配功能(例如agrep),但最簡單的方法是使用pmatch函數。這裏有一個簡單的例子:

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 

一旦你創建了比賽,你們可以一起使用,而不是那些容易合併。

+0

謝謝謝恩,你的建議總是有幫助的 - 我會看看這兩個,讓你知道它是如何工作的。 – 2010-02-09 21:22:07

+0

是的,很棒的提示Shane。 – Jay 2010-02-11 16:29:03

+3

問題更多時,名稱更骯髒,然後。說出第一個單詞是否可能短格式化,以及何時其餘單詞可能會或可能不會被簡化。這種短格式在單個名稱或名稱內部不一致。 – Jay 2010-02-14 15:33:43

1

我是加拿大本地人,承認基金名稱。

這是一個困難的問題,因爲每個數據提供者都會爲各個基金名稱選擇自己的表單。有些人使用不同的結構,比如所有的基金或者類別都結束了。每個人似乎都會選擇自己的短格式,並且這些格式會定期更改。

這就是爲什麼像你這樣的很多人正在定期做這個。一些諮詢公司會列出索引來鏈接各種來源,不知道你是否探索過這條路線?

正如Shane和Marek指出的那樣,這是一個比直接連接更多的匹配任務。許多公司都在爲此而苦苦掙扎。我在我的這個工作中間...

周杰倫

+0

這很令人沮喪。我很驚訝他們沒有分配給他們的代碼。命名法並沒有完全標準化,甚至資產類別在同一年也不匹配到一個供應商,更不用說同一個月。如果你正在研究這個問題,我很樂意有機會更詳細地討論它:brandon AT bertelsen dot ca is me。 – 2010-02-09 21:19:44

+1

當然,有些代碼只有在他們自己的系統中才是標識符......我希望oppurtunity也可以討論和合作。我會很快給你發一封電子郵件。 – Jay 2010-02-09 21:32:37

+1

看來我只能評論我自己的回答.... 所以我同意jmoy一個應該構造一個索引(id)用於加入不同的來源。關鍵是創建這些指數;)一些標準的東西有些沒有。這是一個很難的。有沒有經驗豐富的數據集成商可能知道我們中的某些人可能不會? 近似匹配和所有surronding是我發現開始處理這些問題的最自動化的方式。 – Jay 2010-02-10 04:57:46

相關問題