2013-03-12 4 views
-3

두 개의 열 (name 및 action_id)이있는 데이터 프레임이 있습니다. 이름은 종종 여러 action_ids 있고, action_ids는 또한 같은 여러 이름과 관련된 :다른 열을 기준으로 한 중복 값

name action_id 
Bob 1 
Bob 2 
Bob 3 
Tom 2 
Tom 1 
Bill 1 
Bill 3 

여기 내 문제 야 : 나는 인덱스에 이름에 따라 action_ids 사이의 중복을 시도하고있다. 따라서 이름이 두 개의 action_id와 연결되어 있고 다른 이름이 같은 두 개의 action_ids와 연결되어있는 경우 두 개의 action_id 사이의 겹치기는 1입니다. 위 데이터의 경우이 함수는 action_ids 1과 2, 1 사이에 1의 겹침을 반환합니다 1과 3 사이, 다른 잠재적 중첩에 대해서는 0입니다. 나는과 같이, 모든 가능성의 action_id의 중복 및 그 중복의 인스턴스 데이터 테이블을 떠올 해요 : 내가 이것을 해결하기 위해 노력했습니다

1 2 3 
1 - 0 0 
2 1 - 0 
3 1 0 - 

인덱스 모든 action_ids는 관련 데이터 테이블에 데이터 프레임을 변환하여 하지만 사용자가 위와 같이 action_id 전용 테이블로 데이터 테이블을 변환하는 데 문제가 있습니다.

나는 모든 데이터를 루핑 할 것을 생각했지만 수백만 행을 다루고 있습니다. for/if 루프는 시간 효율적이지 않으므로 벡터 기반 솔루션을 찾으려고합니다.

+1

이 예 – alexwhan

+0

에 대한 전체 원하는 출력의 특정 표시를 제공하기 위해 좋은 것입니다 @ alexwhan 그들이 단락의 예에서 원하는 구체적인 출력을주었습니다. –

+0

사실, 데이터를 표시하는 대신 "나는 사진을 찍고 있습니다 ..."대신에 나타납니다. 나는 까다 롭지 않으려 고하지만 일반적으로 더 빠르고 정확한 답변을 유도합니다. – alexwhan

답변

2

나는 이것이 당신이 원하는 방법으로 중복을 계산 생각 :

overlap = function(df, id1, id2) { 
    id_by_name = tapply(df$action_id, df$name, unique) 
    ids_in_name = lapply(
    id_by_name, 
    function(x) { 
     all(c(id1, id2) %in% x) 
    } 
) 
    overlapping_names = names(ids_in_name)[unlist(ids_in_name)] 
    if (length(overlapping_names) >= 2) { 
    return(1) 
    } else { 
    return(0) 
    } 
} 

출력 :

> overlap(df, 1, 2) 
[1] 1 
> overlap(df, 2, 3) 
[1] 0 
관련 문제