【问题标题】:How can I extract clusters from an igraph network?如何从 igraph 网络中提取集群?
【发布时间】:2019-10-13 10:19:03
【问题描述】:

我有一个如下所示的 data.frame(有 1135 行):

         var1   var2  corr
590   OTU3902 K00021 0.832
624   OTU2457 K00076 0.847
770   OTU0939 K00184 0.842
774   OTU0939 K00185 0.818
792   OTU3902 K00209 0.828
1053  OTU2859 K00299 0.803
1127  OTU0001 K00320 0.845
1128  OTU0041 K00320 0.819
1129  OTU1364 K00320 0.850
1130  OTU1891 K00320 0.803
1131  OTU2859 K00320 0.841
1137  OTU2457 K00329 0.845
1409  OTU0939 K00349 0.806
1465  OTU1531 K00366 0.840
1470  OTU1531 K00367 0.847
1474  OTU0001 K00368 0.840
1475  OTU0095 K00368 0.829
1544  OTU3041 K00395 0.820
1729  OTU0939 K00496 0.830
1750  OTU0735 K00508 0.835

我用:


g <- graph.data.frame(data, directed=FALSE)
plot(g)

网络创建良好。但是,它会创建一些集群,我想分别提取每个集群。 igraph 是否有一个选项来获取不同的数据帧(或另一种向量):一个数据帧将对应一个集群?

这是我的网络。我猜这是一团糟,但你可以看到有一些子网络。因此,如果可能的话,我想隔离这些子网络并在 list/data.frame 中获取每个子网络的组件。

【问题讨论】:

  • 您希望在这些数据帧/向量中看到什么?您的 data 用于边,而集群用于顶点。例如,第一行的 OTU3902 和 K00021 可能在不同的集群中。
  • 例如,OTU3902 可以在几行中找到。我想要的是:我的网络是几个组/集群的混合(我不知道正确的术语),所以我想在 list 或 data.frame 中提取每个集群(它们是不同 KO 和 OTU 的混合) ?我所说的组/集群是一个“子网络”,不与其他组链接。
  • 最好包含一个示例输出。现在听起来你想找到孤立的组件。
  • 我编辑了我的帖子。

标签: r igraph


【解决方案1】:

您似乎希望找到图表的孤立组件。这可以通过components 来完成,如

components(g)
# $membership
# OTU3902 OTU2457 OTU0939 OTU2859 OTU0001 OTU0041 OTU1364 OTU1891 OTU1531 OTU0095 OTU3041 OTU0735 
#       1       2       3       4       4       4       4       4       5       4       6       7 
#  K00021  K00076  K00184  K00185  K00209  K00299  K00320  K00329  K00349  K00366  K00367  K00368 
#       1       2       3       3       1       4       4       2       3       5       5       4 
#  K00395  K00496  K00508 
#       6       3       7 
# 
# $csize
# [1] 3 3 5 9 3 2 2
#
# $no
# [1] 7

显示哪个顶点属于哪些组件,这些组件的大小以及组件的数量。

现在只是按组件获取顶点列表,我们可以这样做

split(V(g), components(g)$membership)
# $`1`
# + 3/27 vertices, named, from 7eee8fa:
# [1] OTU3902 K00021  K00209 
#
# $`2`
# + 3/27 vertices, named, from 7eee8fa:
# [1] OTU2457 K00076  K00329 
# ...

甚至更干净,

split(names(V(g)), components(g)$membership)
# $`1`
# [1] "OTU3902" "K00021"  "K00209" 
#
# $`2`
# [1] "OTU2457" "K00076"  "K00329" 
#
# $`3`
# [1] "OTU0939" "K00184"  "K00185"  "K00349"  "K00496" 
# ...

【讨论】:

  • 谢谢,这正是我想要的。根据我的输入文件,你知道 igraph 最多可以创建多少行网络吗? (我在这篇文章中使用的输入文件有 1171 行,但我可以导入一个有 1 000 000 行的文件吗?)
  • @Paillou,R 本身的 3 列和 1000000 行应该不是什么大问题。现在我不确定 igraph,它真的取决于它如何处理存储图。例如,一个 1000000x1000000 的邻接矩阵肯定会是一个问题。来看看会发生什么!
猜你喜欢
  • 2021-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-02
  • 2023-03-12
  • 2015-03-11
相关资源
最近更新 更多