2015-01-27 7 views
2

각각 100K 행 이상인 2 개의 데이터 세트가 있습니다. 릴리스 날짜를 사용하는 것과 마찬가지로 하나의 열 ('영화 제목')과 일치하는 퍼지 문자열을 기반으로 병합하려고합니다. 아래 두 데이터 세트의 샘플을 제공하고 있습니다.r에 일치하는 퍼지 문자열

데이터 세트-1

itemid userid rating  time        title release_date 
99991 1673 835  3 1998-03-27        mirage   1995 
99992 1674 840  4 1998-03-29       mamma roma   1962 
99993 1675 851  3 1998-01-08      sunchaser, the   1996 
99994 1676 851  2 1997-10-01     war at home, the   1996 
99995 1677 854  3 1997-12-22      sweet nothing   1995 
99996 1678 863  1 1998-03-07       mat' i syn   1997 
99997 1679 863  3 1998-03-07       b. monkey   1998 
99998 1680 863  2 1998-03-07      sliding doors   1998 
99999 1681 896  3 1998-02-11      you so crazy   1994 
100000 1682 916  3 1997-11-29 scream of stone (schrei aus stein)   1991 

세트 - 2

itemid userid rating  time         title release_date 
1 2844 4477  3 2013-03-09 fantã´mas - 〠l'ombre de la guillotine   1913 
2 4936 8871  4 2013-05-05        the bank   1915 
3 4936 11628  3 2013-07-06        the bank   1915 
4 4972 16885  4 2013-08-19     the birth of a nation   1915 
5 5078 11628  2 2013-08-23        the cheat   1915 
6 6684 4222  3 2013-08-24        the fireman   1916 
7 6689 4222  3 2013-08-24       the floorwalker   1916 
8 7264 2092  4 2013-03-17        the rink   1916 
9 7264 5943  3 2013-05-12        the rink   1916 
10 7880 11628  4 2013-07-19        easy street   1917 

내가 'agrep이'살펴 보았다하지만 한 번에 하나의 문자열과 일치합니다. 'stringdist'함수는 훌륭하지만 루프에서 실행하고 최소 거리를 찾은 다음 데이터 세 트 크기가 주어지면 시간이 많이 소요되는 추가 사전 처리를 수행해야합니다. 문자열에는 퍼지 매칭이 필요하기 때문에 오타 및 특수 문자를 사용할 수 있습니다. 나는 주변을 둘러 보았고 'Lenenshtein'과 'Jaro-Winkler'방법을 발견했다. 나중에 읽은 것은 문자열에 오타가있을 때 유용합니다.

퍼지 매칭만으로는 좋은 결과를 얻을 수 없습니다. 예를 들어, 한 데이터 세트의 영화 제목 '장난감 이야기'는 다른 장난감 세트의 '장난감 이야기 2'와 일치 할 수 있습니다. 따라서 일치하는 영화가 고유한지 확인하려면 출시 날짜를 고려해야합니다.

루프를 사용하지 않고이 작업을 수행 할 수있는 방법이 있는지 알고 싶습니까? 최악의 시나리오 루프를 사용해야하는 경우, 어떻게하면 효율적이고 신속하게 작동하게 할 수 있습니까?

다음 코드를 시도했지만 처리하는 데 많은 시간이 걸렸습니다.

for(i in 1:nrow(test)) 
    for(j in 1:nrow(test1)) 
    { 

    test$title.match <- ifelse(jarowinkler(test$x[i], test1$x[j]) > 0.85, 
         test$title, NA) 
    } 

시험 - 1682 개 독특한 영화 이름은 대소에게 TEST1을 낮추기로 변환 포함 - 11,451 독특한 영화 이름은 대소에게

루프 위해를 방지하고 빠르게 작업 할 수있는 방법이 있나요 낮은 변환 포함?

+2

질문을 다시 게시하지 마십시오. 현상금 시작 – rawr

답변

1

앞으로 나아갈 수있는 방법은 무엇입니까? 결과를 확인한 후 일치의 정도를 0.85에서 조정할 수 있습니다. 그런 다음 dplyr을 사용하여 일치하는 제목으로 그룹화하고 릴리스 날짜를 빼서 요약 할 수 있습니다. 모든 0은 동일한 출시 날짜를 의미합니다.

dataset-1$title.match <- ifelse(jarowinkler(dataset-1$title, dataset_2$title) > 0.85, dataset-1$title, NA) 
+0

나는이 방법을 묻고 싶다. 도움말 페이지에서 배열이나 벡터의 길이가 같거나 짧아야한다는 것을 알려줍니다. 이 방법을 크기가 다른 데이터 세트에 사용할 수 있습니까? 하나의 데이터 세트는 정확히 100K 행을 포함하고 다른 데이터 셋은 117K 행을 포함합니다. 고유 한 제목은 한 데이터 집합에서 1682이고 다른 데이터 집합에서 11451입니다. 이 상황을 해결할 방법을 제안 해 주시겠습니까? 불평등 한 데이터 세트에서 함수를 실행하려고 시도했지만 예상대로 오류가 발생했습니다. – syebill

+0

당신의 코드는 루프가 필요하다고 생각합니다. 그렇지 않으면 두 데이터 세트의 요소 -i와 요소 -i 만 일치하게됩니다. 나는 다시 두 개의 루프를 필요로하는 일치하는 값을 찾기 위해 두 번째 데이터 세트의 모든 제목을 조사하려고합니다. 벡터 라이 제이션을 사용하여 작업을 완료하는 방법에 대한 아이디어가 있습니까? 아니면 sapply/lapply 일 수 있습니까? – syebill

+0

일부 코드를 시도해보고 질문을 편집하여 게시하십시오. – lawyeR