从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,或许您可以帮助解决类似的问题?不用担心。非常感谢。