2010-02-09 1 views
9

설명는 내가 병합하는 데 필요한 정보와이 개 데이터 세트를 가지고 R

에 퍼지/대략 문자열 매칭을 사용하여 프레임. 내가 가진 유일한 공통 필드는 완벽하게 일치하지 않는 문자열과 실질적으로 다를 수있는 숫자 필드입니다.

문제를 설명하는 유일한 방법은 데이터를 표시하는 것입니다. 여기에 a.csvb.csv입니다. B와 A를 병합하려고합니다.

A. 회사 이름 (파일 A 전용), 기금 이름, 자산 클래스 및 자산에는 B 필드와 필드가 있습니다. 지금까지, 내 ​​초점은 단어 나 정확한 일치를 만들 수있는 문자열의 부품을 교체 한 후 사용하여 펀드 이름과 일치하도록 시도에있다 :

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 % 일치하는 날을 제공합니다. 나머지는 손으로해야합니다.

자산은 항상 정확하지 않은 숫자 필드이며 펀드의 자산이 적을 경우 크게 달라질 수 있습니다. Asset Class는 두 파일에서 "일반적으로"동일한 문자열 필드이지만 불일치가 있습니다. ,

AGF 캐나다 값

AGF 캐나다 값-D 이러한 경우

: 합병증에 추가

는 예를 들어, 파일 B에, 자금의 다른 일련의 나는 세속적이지 않은 것을 고르거나, "A", "-A"또는 "Advisor"라고 불리는 것을 선택해야합니다.

당신은 무엇을 말할 것

질문이 가장 좋은 방법입니까? 이 운동은 매월해야 할 일이며 수동으로 매치하는 것은 엄청나게 많은 시간이 걸립니다. 코드의 예는 유용 할 것입니다.

아이디어 내가 문자열의 각 단어의 첫 대문자를 기반으로 문자열을 정상화되어 작동 할 수 생각

한 가지 방법. 그러나 나는 R을 사용하여 그 방법을 찾아 낼 수 없었습니다.

내가 고려한 또 다른 방법은 자산, 펀드 이름, 자산 클래스 및 회사의 조합을 기반으로하는 일치 지수를 작성하는 것이 었습니다. 그러나 다시, 나는 R로 이것을 어떻게하는지 확신하지 못한다. 또는 그것이 중요 할지라도 그것이 가능하다면.

코드, 의견, 생각 및 방향에 대한 사례를 크게 높이 평가합니다.

+1

우리가 문자열 일치에 대해 말하면 '? agrep' (기본 패키지에서). – Marek

+1

게시 후 몇 년 동안 예제를 사용할 수 있도록 게시물의 데이터 부분을 만들 수 있다면 좋을 것입니다. 감사. – Jochem

+0

실제로 몇 년 후에 데이터가 없습니다. –

답변

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

7

빠른 제안 하나 : 병합을 사용하기 전에 다른 필드에서 일부 일치를 개별적으로 시도해보십시오. 가장 간단한 방법은 pmatch 함수로, R에는 텍스트 일치 기능이 부족하지 않습니다 (예 : agrep).이 a에서 모든 펀드 이름과 일치, 데이터 집합에 대한

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

: 다음은 간단한 예제

> 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

감사합니다 쉐인, 당신의 제안은 항상 도움이됩니다 - 나는이 두 가지를 살펴보고 어떻게 효과가 있었는지 알려줄 것입니다. –

+0

예, 분명히 훌륭한 팁입니다. – Jay

+3

이름이 더 지저분 할 때 문제가 더 많습니다. 첫 번째 단어가 짧은 형식 일 수도 있고 그렇지 않을 수도 있고 나머지 단어가 짧은 형식 일 수도 있고 그렇지 않을 수도 있습니다. 이 짧은 형태는 단일 이름 또는 전체 이름 안에서 일관성이 없습니다. – Jay

1

저는 캐나다의 로컬이기도하여 펀드 이름을 알고 있습니다.

각 데이터 제공 업체가 개별 펀드 이름에 대해 자신의 양식을 선택하기 때문에 어려운 사례입니다. 일부는 기금이나 클래스의 다른 모든 구조와 같은 다른 구조를 사용하여 다른 모든 곳입니다. 각자는 자신의 짧은 형식을 선택하는 것처럼 보이며 이러한 변화는 정기적으로 바뀝니다.

그래서 많은 사람들이 정기적으로 손으로 이것을하고 있습니다. 컨설팅 회사 중 일부는 다양한 출처를 연결하는 인덱스를 나열하고 있습니다. 해당 경로를 탐색했는지는 확실하지 않습니다.

셰인 (Shane)과 마렉 (Marek)이 지적했듯이 이것은 직선 결합 (straight join) 이상의 매치 작업입니다. 많은 회사들이이 회사와 어려움을 겪고 있습니다. 나는

제이

+0

실망 스럽습니다. 나는 그들에게 할당 된 코드가 없다는 것에 정말로 놀랐다. 명명법은 전혀 표준화되지 않았으며 자산 등급조차도 같은 달에 한 해 동안 한 공급 업체에서 다음 연도로 일치하지 않습니다.이 일을하고 있다면, 좀 더 자세하게 토론 할 기회가 있습니다. brandon AT bertelsen dot ca is me. –

+1

확실히 일부 코드는 있지만 자체 시스템에서만 식별 자입니다 ... 저는 oppurtunity가 토론하고 공동 작업하기를 바랍니다. 곧 이메일로 알려 드리겠습니다. – Jay

+1

그것은 내 자신의 대답에 대해서만 논평 할 수있는 것 같습니다. 그래서 저는 jmoy와 하나의 색인을 만들어야합니다. (id) 다른 소스에 참여하는 것이 좋습니다. 핵심은 이러한 색인을 만드는 것입니다.) 표준 물건 중 일부는 그렇지 않습니다. 그것은 어려운 것입니다. 아마도 우리 중 일부가 알지 못하는 경험이 풍부한 데이터 통합자가 있습니까? 이러한 문제를 해결하기 위해 가장 자동화 된 방법 인 대략적인 검색 및 모든 검색이 나와 있습니다. – Jay

관련 문제