从igraph中的特定群集检索节点和边的列表
假设图形中有以下簇:从igraph中的特定群集检索节点和边的列表,r,dataframe,igraph,R,Dataframe,Igraph,假设图形中有以下簇: library("igraph") set.seed(3) g <- barabasi.game(20, m=2, directed=FALSE) eb <- cluster_edge_betweenness(g) plot(eb, g, layout=layout_with_fr) 是否可以检索节点列表或数据帧以及包含数字5的集群的相应边缘?如果一个节点存在于多个集群中,例如8或14,情况会怎样 谢谢 我不知道有什么方法可以让它自动完成。然而,你可以很容易
library("igraph")
set.seed(3)
g <- barabasi.game(20, m=2, directed=FALSE)
eb <- cluster_edge_betweenness(g)
plot(eb, g, layout=layout_with_fr)
是否可以检索节点列表或数据帧以及包含数字5的集群的相应边缘?如果一个节点存在于多个集群中,例如8或14,情况会怎样
谢谢 我不知道有什么方法可以让它自动完成。然而,你可以很容易地用手做到这一点 我不确定你所说的出现在多个集群中是什么意思。从图中节点的颜色和介数集群的输出可以看出,集群成员资格是互斥的。共有6组:
print(eb)
IGRAPH clustering edge betweenness, groups: 6, mod: 0.26
+ groups:
$`1`
[1] 1 2 3 14 15
$`2`
[1] 4 5 6 10 19
$`3`
[1] 7 11 16
$`4`
+ ... omitted several groups/vertices
eb$membership
[1] 1 1 1 2 2 2 3 4 5 2 3 4 6 1 1 3 4 4 2 4
# extract all edges of the graph
d <- igraph::as_data_frame(g, what="edges")
# get membership of interested node
memb <- eb$membership[V(g)==5]
memb
[1] 2
# get all nodes with the same membership
memb_nodes <- V(g)[eb$membership==memb]
memb_nodes
+ 5/20 vertices, from 293a69d:
[1] 4 5 6 10 19
# subset
d <- d[d$from %in% memb_nodes & d$to %in% memb_nodes, ]
d
from to
9 4 6
16 4 10
17 5 10
34 4 19
35 5 19
我不知道有什么方法可以让它自动完成。然而,你可以很容易地用手做到这一点 我不确定你所说的出现在多个集群中是什么意思。从图中节点的颜色和介数集群的输出可以看出,集群成员资格是互斥的。共有6组:
print(eb)
IGRAPH clustering edge betweenness, groups: 6, mod: 0.26
+ groups:
$`1`
[1] 1 2 3 14 15
$`2`
[1] 4 5 6 10 19
$`3`
[1] 7 11 16
$`4`
+ ... omitted several groups/vertices
eb$membership
[1] 1 1 1 2 2 2 3 4 5 2 3 4 6 1 1 3 4 4 2 4
# extract all edges of the graph
d <- igraph::as_data_frame(g, what="edges")
# get membership of interested node
memb <- eb$membership[V(g)==5]
memb
[1] 2
# get all nodes with the same membership
memb_nodes <- V(g)[eb$membership==memb]
memb_nodes
+ 5/20 vertices, from 293a69d:
[1] 4 5 6 10 19
# subset
d <- d[d$from %in% memb_nodes & d$to %in% memb_nodes, ]
d
from to
9 4 6
16 4 10
17 5 10
34 4 19
35 5 19
也许你可以试试下面的代码
grps <- split(V(g),eb$membership)
grp <- unlist(subset(grps,mapply(`%in%`,5,grps)))
df <- subset(get.data.frame(g),from %in% grp & to %in% grp)
也许你可以试试下面的代码
grps <- split(V(g),eb$membership)
grp <- unlist(subset(grps,mapply(`%in%`,5,grps)))
df <- subset(get.data.frame(g),from %in% grp & to %in% grp)
谢谢@ThomasIsCoding!如果我使用一个聚类算法,同一个节点存在于多个集群中,每个集群都有不同的边缘,那么这段代码也可以工作吗?df的格式是否可以让我辨别出哪些连接/边是单个集群的一部分?@Abigail575我认为这是可能的,但这取决于如何表示重叠的顶点。假设eb可以在每个组中呈现重叠,您可以再次运行grp Hello@thomasscoding,或许您可以帮助解决类似的问题?不用担心。非常感谢。谢谢@ThomasIsCoding!如果我使用一个聚类算法,同一个节点存在于多个集群中,每个集群都有不同的边缘,那么这段代码也可以工作吗?df的格式是否可以让我辨别出哪些连接/边是单个集群的一部分?@Abigail575我认为这是可能的,但这取决于如何表示重叠的顶点。假设eb可以在每个组中呈现重叠,您可以再次运行grp Hello@thomasscoding,或许您可以帮助解决类似的问题?不用担心。非常感谢。