检索 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
我有一个 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