在iGraph中模拟网络后将组成员身份添加为节点属性

时间:2020-04-15 01:11:56

标签: r matrix attributes igraph

我(通过SBM)在R中的igraph包中创建了一个模拟网络:

    library(igraph)
    pr_mat <- cbind(c(0.5,0.001), c(0.001, 0.5))
    g <- sample_sbm(10, pref.matrix = pr_mat, block.sizes = c(5,5), 
                    directed = FALSE, loops = FALSE)

g的邻接矩阵确定节点1-5被视为一组,而节点6-10被视为另一组。

> as_adj(g)
 [1,] . 1 . 1 . . . . . .
 [2,] 1 . 1 1 . . . . . .
 [3,] . 1 . 1 1 . . . . .
 [4,] 1 1 1 . 1 . . . . .
 [5,] . . 1 1 . . . . . .
 [6,] . . . . . . 1 1 . 1
 [7,] . . . . . 1 . 1 1 1
 [8,] . . . . . 1 1 . 1 .
 [9,] . . . . . . 1 1 . 1
[10,] . . . . . 1 1 . 1 .

但是我的sample_sbm调用生成的igraph对象不包含组成员身份作为顶点属性。

> g
IGRAPH 8750fb0 U--- 10 15 -- Stochastic block-model
+ attr: name (g/c), loops (g/l)
+ edges from 8750fb0:
 [1] 1-- 2 2-- 3 1-- 4 2-- 4 3-- 4 3-- 5 4-- 5 6-- 7 6-- 8 7-- 8 7-- 9 8-- 9 6--10 7--10 9--10

如何添加此信息以进行绘图和分析?

1 个答案:

答案 0 :(得分:1)

如果您的采样图包含两个没有共享边的不同成分(如您提供的示例),则可以使用components()$membership获取组成员身份并将其分配给节点属性:

library(igraph)

set.seed(1234)

pr_mat <- cbind(c(0.5,0.001), c(0.001, 0.5))
g <- sample_sbm(10, pref.matrix = pr_mat, block.sizes = c(5,5), 
                directed = FALSE, loops = FALSE)

V(g)$group <- components(g)$membership

plot(g, vertex.color = V(g)$group)

这仅起作用,因为您提供的首选项矩阵会创建两个不同的组件。如果块之间存在边,则图中显然只有一个分量。在这种情况下,您可以使用cluster_*()函数之一:

set.seed(1234)

pr_mat <- cbind(c(0.5,0.1), c(0.1, 0.5))
g <- sample_sbm(10, pref.matrix = pr_mat, block.sizes = c(5,5), 
                directed = FALSE, loops = FALSE)

V(g)$group <- cluster_louvain(g)$membership

plot(g, vertex.color = V(g)$group)

reprex package(v0.3.0)于2020-04-14创建