检索 Igraph 中所有节点的一级连接和二级连接

Retrieve 1st Degree Connections and 2nd Degree Connections for All Nodes in Igraph

我有一个 igraph,我想在其中提取每个节点的所有 1 度连接以及 2 度连接。这些表需要分开。

带有图形图片的完整可重现代码如下:

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)

我希望我的最终结果是一个如下所示的数据框:

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

然后是另一个只有 2 度连接的数据框,理想情况下显示了 2 度连接的来源,但如果这不可能,那么只有 2 度连接就可以了。

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

任何帮助都会很棒,谢谢!

First Degree connection,顾名思义,就是连接到图的边的另一个顶点,所以你可以只使用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"   

边列表returns每条边只有一次边,所以如果你想要所有顶点的第一个连接,你可以切换 from 和 to 列并与原始边矩阵绑定,这给出更方便的一阶连接数据框:

edgeDF <- rbind(edges, edges[,c(2,1)]) %>% 
          as.data.frame() %>% 
          setNames(c("NodeId", "FirstConnection"))

edgeDF %>% arrange(NodeId, FirstConnection)
#       NodeId FirstConnection
# 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        Egg           Bravo
# 10     Felix         Colonel
# 11     Felix            Demo
# 12     Felix       Hurricane
# 13     Felix          Indigo
# 14  Gasoline           Alpha
# 15  Gasoline            Demo
# 16  Gasoline             Jab
# 17 Hurricane           Bravo
# 18 Hurricane           Felix
# 19    Indigo         Colonel
# 20    Indigo           Felix
# 21       Jab            Demo
# 22       Jab        Gasoline

二度连接是你一级连接的连接,只是二度连接不能是原始节点,所以你可以将一级数据框与自身连接起来,过滤二度连接的记录等于节点本身:

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