2014-06-21 2 views
2

이 행렬 I 2 요소 정수 벡터의 기, 예를 들면 각 행한다고 가정클러스터링 2 소자 정수 벡터

my.mat = matrix(data = c(1,4,2,5,7,2,3,6,3,8), ncol = 2, byrow=T) 
> my.mat 
    [,1] [,2] 
[1,] 1 4 
[2,] 2 5 
[3,] 7 2 
[4,] 3 6 
[5,] 3 8 

또는 대안 목록 : 난

my.list = list(c(1,4), c(2,5), c(7,2), c(3,6), c(3,8)) 

을 이 벡터들과 서로 교차하는 함수를 찾고 list을 반환합니다. 각 요소는 모든 교차하는 벡터의 값입니다. 다른 벡터와 교차하지 않는 벡터 값은 목록 요소로 반환되어야합니다. 당신이 볼 수 있듯이

list(c(1,4), c(2,5,7,2), c(3,6,3,8)) 

이, 벡터 C (1,4)이 다른 벡터와 교차하지 않으므로 그것은 하나의 요소로 반환됩니다 : 일반 즉

이이 목록을 반환해야 명부. 두 개의 다른 목록 요소는 교차점입니다.

+1

항상 겹치는 첫 번째 열만입니까? – MrFlick

+0

의견을 보내 주셔서 감사합니다. 그에 따라 내 질문을 편집했습니다. – user1701545

답변

2

이 유형의 문제에는 igraph 패키지를 사용하고 싶습니다. 그래프의 행을 가장자리로 생각하기 쉽고 연결된 모든 청크를 찾고 있기 때문입니다.

my.mat = matrix(data = c(1,4,2,5,7,2,3,6,3,8), ncol = 2, byrow=T) 

library(igraph) 
class(my.mat)<-"character" 
gg <- graph.edgelist(my.mat, directed=T) 
vset <- clusters(gg)$membership 

xx<-sapply(unique(vset), function(s) { 
    es <- E(gg)[from(V(gg)[vset==s])] 
    as.numeric(V(gg)[t(get.edges(gg,es))]$name) 
}) 

이렇게하면 행렬이 가장자리 목록으로 바뀝니다 (비 연속적인 숫자가있는 경우 문자 만 변환하면됩니다). 즉, 서브 그룹으로 그래프를

enter image description here

그런 다음 clusters() 함수 파티션들을 만든다. 그런 다음 각 하위 그룹을 살펴보고 각 하위 그룹의 가장자리에있는 꼭지점의 이름을 추출합니다.

결국

, xx의 값

[[1]] 
[1] 1 4 

[[2]] 
[1] 2 5 7 2 

[[3]] 
[1] 3 6 3 8 

그래서 그것이 연결된 값 목록의 것이다.

+0

+ 10 수 있다면! 훌륭해! 정말 솔루션을 볼 수 있기 때문에 그래프의 줄거리를 추가 할 것입니다! – agstudy