2016-10-09 1 views
2

2 차 연결과 함께 각 노드의 모든 1 차 연결을 추출하려는 igraph가 있습니다. 테이블은 분리되어 있어야합니다. 그래프의 그림과Igraph의 모든 노드에 대해 1 차 연결 및 2 차 연결 검색

전체 재현 코드는 다음과 같습니다 : 다음

Node ID  1st Degree Connections 
Alpha   Gasoline 
Bravo   Egg 
Bravo   Hurricane 
Colonel   Felix 
Colonel   Indigo 
Demo   Felix 
Demo   Gasoline 
Demo   Jab 
Egg    Bravo 
Felix   Colonel 
Felix   Demo 
Felix   Hurricane 
Felix   Indigo 
Gasoline  Alpha 
Gasoline  Demo 
Gasoline  Jab 
Hurricane  Bravo 
Hurricane  Felix 
Indigo   Colonel 
Indigo   Felix 
Jab    Demo 
Jab    Gasoline 

과 :

library(igraph) 
library(visNetwork) 
B = matrix( 
    c(1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 
    0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 
    0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 
    0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 
    0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 
    0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 
    0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 
    0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 1), 
    nrow=10, 
    ncol=10) 
colnames(B) <- c("Alpha", "Bravo", "Colonel", "Demo", "Egg", "Felix", "Gasoline", "Hurricane", "Indigo", "Jab") 
rownames(B) <- c("Alpha", "Bravo", "Colonel", "Demo", "Egg", "Felix", "Gasoline", "Hurricane", "Indigo", "Jab") 

g96e = t(B) %*% B 

i96e = graph.adjacency(g96e, mode = "undirected", weighted = TRUE, diag=FALSE) 
visIgraph(i96e) 

enter image description here

나는이처럼 보이는 dataframe로 내 최종 결과를 싶습니다 2도 연결이있는 또 다른 데이터 프레임이며 이상적으로 2도 연결의 출처를 보여줍니다.하지만 가능하지 않은 경우 2 Nd 학위 연결이 할 것입니다.

Node ID  2nd Degree Connections  From 1st Degree Connection 
Alpha    Demo      Gasoline 
Alpha    Jab      Gasoline 
Bravo    Felix     Hurricane 
Colonel    Demo      Felix 
Colonel    Hurricane    Felix 
Colonel    Indigo     Felix 
Colonel    Felix     Indigo 
Demo    Colonel     Felix 
Demo    Hurricane    Felix 
Demo    Indigo     Felix 
Demo    Alpha     Gasoline 
Demo    Jab      Gasoline 
Demo    Gasoline     Jab 
Egg     Hurricane    Bravo 
Felix    Indigo     Colonel 
Felix    Gasoline     Demo 
Felix    Jab      Demo 
Felix    Bravo     Hurricane 
Felix    Colonel     Indigo 
Gasoline   Felix     Demo 
Gasoline   Jab      Demo 
Gasoline   Demo      Jab 
Hurricane   Egg      Bravo 
Hurricane   Colonel     Felix 
Hurricane   Demo      Felix 
Hurricane   Indigo     Felix 
Indigo    Felix     Colonel 
Indigo    Colonel     Felix 
Indigo    Demo      Felix 
Indigo    Hurricane    Felix 
Jab     Felix     Demo 
Jab     Gasoline     Demo 
Jab     Alpha     Gasoline 
Jab     Demo      Gasoline 

어떤 도움을 주셔서 감사합니다.

은, 정의에 의해, 그래프의 에지들에 접속 된 다른 정점

답변

2

학사 연결이다 때문에 단지 행렬 그래프 오브젝트의 모든 직접 연결 검색 할 get.edgelist()을 사용할 수

library(igraph); library(dplyr); 

edges <- get.edgelist(i96e) 
edges 

#   [,1]  [,2]  
# [1,] "Alpha" "Gasoline" 
# [2,] "Bravo" "Egg"  
# [3,] "Bravo" "Hurricane" 
# [4,] "Colonel" "Felix"  
# [5,] "Colonel" "Indigo" 
# [6,] "Demo"  "Felix"  
# [7,] "Demo"  "Gasoline" 
# [8,] "Demo"  "Jab"  
# [9,] "Felix" "Hurricane" 
# [10,] "Felix" "Indigo" 
# [11,] "Gasoline" "Jab" 

가장자리 목록은 각 가장자리에 대해 한 번만 가장자리를 반환하므로 모든 꼭지점에 대한 첫 번째 연결을 원하면 시작 및 끝 열을 전환하고 원래 가장자리 행렬과 바인딩하면보다 편리한 1 차 연결 데이터가 제공됩니다 프레임 :

2 차 연결은 2 차 연결이 원래 노드가 아니어야한다는 것을 제외하고는 1 차 연결의 연결입니다. 따라서 1 차 데이터 프레임을 자신과 결합 할 수 있고 2 차 연결이 노드와 동일한 필터 레코드 자신 :

SecondCon <- setNames(edgeDF, c("FirstConnection", "SecondConnection")) %>% 
      full_join(edgeDF) %>% filter(NodeId != SecondConnection) 

SecondCon %>% arrange(NodeId, FirstConnection, SecondConnection) 
# FirstConnection SecondConnection NodeId 
# 1   Gasoline    Demo  Alpha 
# 2   Gasoline    Jab  Alpha 
# 3  Hurricane   Felix  Bravo 
# 4   Felix    Demo Colonel 
# 5   Felix  Hurricane Colonel 
# 6   Felix   Indigo Colonel 
# 7   Indigo   Felix Colonel 
# 8   Felix   Colonel  Demo 
# 9   Felix  Hurricane  Demo 
# 10   Felix   Indigo  Demo 
# 11  Gasoline   Alpha  Demo 
# 12  Gasoline    Jab  Demo 
# 13    Jab   Gasoline  Demo 
# 14   Bravo  Hurricane  Egg 
# 15   Colonel   Indigo  Felix 
# 16   Demo   Gasoline  Felix 
# 17   Demo    Jab  Felix 
# 18  Hurricane   Bravo  Felix 
# 19   Indigo   Colonel  Felix 
# 20   Demo   Felix Gasoline 
# 21   Demo    Jab Gasoline 
# 22    Jab    Demo Gasoline 
# 23   Bravo    Egg Hurricane 
# 24   Felix   Colonel Hurricane 
# 25   Felix    Demo Hurricane 
# 26   Felix   Indigo Hurricane 
# 27   Colonel   Felix Indigo 
# 28   Felix   Colonel Indigo 
# 29   Felix    Demo Indigo 
# 30   Felix  Hurricane Indigo 
# 31   Demo   Felix  Jab 
# 32   Demo   Gasoline  Jab 
# 33  Gasoline   Alpha  Jab 
# 34  Gasoline    Demo  Jab 
+1

완벽하고, 내가 생각했던 것보다 훨씬 적은 코드. 당신의 도움을 주셔서 감사합니다! –