2017-01-13 3 views
0

그룹 ID 및 해당 멤버가있는 데이터 프레임이 있습니다. 회원을 공유하는 모든 그룹을 결합하고 싶습니다. 그들이 부재 (2)를 공유하기 때문에 나는이 큰 그룹에 대한 식별자를 추가하고 싶습니다, a와 b가 더 큰 그룹에 속해 여기R : 중복 요소가있는 그룹 결합

data.frame(group = c("a", "a", "b", "b", "c", "c"), 
      member = c(1, 2, 2, 3, 4, 5)) 

그룹 :

나는 이런 식으로 뭔가를해야 할 수도 있습니다, 설명하기 그래서 나는 다음과 같이 끝낼 것입니다.

data.frame(largeg = c("A", "A", "A", "A", "B", "B"), 
      group = c("a", "a", "b", "b", "c", "c"), 
      member = c(1, 2, 2, 3, 4, 5)) 

R로 구현하려면 어떻게해야합니까? magrittr 체인에서 작동하는 솔루션은 최고 일 것입니다. 그러나 그것은 필수 사항은 아닙니다.

(I는 식별자 모양을 걱정하지 않는다. 그들은 모두 할 수는 그냥 일을 명확히하기 위해 대문자, 소문자, 여기에 번호를 사용 할 수 있습니다.)

답변

1

당신이 같은 데이터를 생각한다면 그래프를 보면 작은 그룹이 구성원을 통해 연결된 경우 동일한 그룹에 속하는 것을 알 수 있습니다. 이 문제를 해결 할 수 igraph 패키지 (df는 원래 data.frame입니다) :

require(igraph) 
df$largeg<-components(graph_from_data_frame(df))$membership[df$group] 
# group member largeg 
#1  a  1  1 
#2  a  2  1 
#3  b  2  1 
#4  b  3  1 
#5  c  4  2 
#6  c  5  2 

당신은 물론 후 largeg의 이름을 변경할 수 있습니다. magrittr 체인에 추가 할 수있는 기능으로


:

FindComponents <- function(df, group, id) { 
    df <- df[, c(group, id)] 
    gr <- graph_from_data_frame(df) 
    as.vector(components(gr)$membership[df[[group]]]) 
} 

사용법 :

내가 찾던 정확히 무엇
df %>% 
    mutate(largeg = FindComponents(., 'group', 'id')) 
+1

. 문제의 그래프 특성을 지적 해 주셔서 감사합니다. 나는 당신의 대답에 magrittr/dplyr chainable 함수를 추가 할 자유를 얻었다. – severin

+0

도움이 되니 기쁩니다. 편집을 수락했습니다. – nicola