使用 igraph 包生成网络对象的方法

本文由会员 @长江万里 投稿。

网络分析可以用来分析各种对象之间的相互关系。在 R 语言里面我们可以使用 igraph 包创建网络并进行分析。本文讲介绍几种使用 igraph 包创建网络对象的方法。

安装 igraph 包

在 R 语言中运行下面的代码即可安装:

install.packages("igraph", dependencies = TRUE)

加载 igraph 包

安装完之后就可以使用 library() 进行加载了:

library(igraph)

创建网络对象

下面介绍了五种创建网络对象的方法。

第一种:小型图创建方式

使用 graph.formula() 函数可以创建比较简单的网络图:

graph.formula(1-2, 1-3, 2-3, 2-4, 3-5, 4-5, 4-6,4-7, 5-6, 6-7) -> g
plot(g)

使用 V() 函数查看节点信息:

V(g)

#> + 7/7 vertices, named, from 0bb0679:
#> [1] 1 2 3 4 5 6 7

该网络共有7个节点。

使用 V()$name 给上述7个节点命名:

V(g)$name <- c('a', 'b', 'c', 'd', 'e', 'f', 'g')

同时,也可以使用 V()$name 查看节点名称:

V(g)$name

#> [1] "a" "b" "c" "d" "e" "f" "g"

使用 E() 查看连边情况:

E(g)

#> + 10/10 edges from 0bb0679 (vertex names):
#> [1] a--b a--c b--c b--d c--e d--e d--f d--g e--f f--g

这个简单的网络共有 10 条边。

创建有向图

创建有向图的时候可以使用-+代表指向关系:

g1 <- graph.formula(1-+2, 1-+3, 2-+3, 2-+4, 3-+5, 4-+5, 4-+6,4-+7, 5-+6, 6-+7)
g1

#> IGRAPH 0e88807 DN-- 7 10 --
#> + attr: name (v/c)
#> + edges from 0e88807 (vertex names):
#> [1] 1->2 1->3 2->3 2->4 3->5 4->5 4->6 4->7 5->6 6->7

plot(g1)

第二种:使用邻接矩阵创建网络

首先生成邻接矩阵:

mat <- matrix(c(0,1,0,1,1,0,1,1,0,1,0,0,1,1,0,0), byrow = T, ncol = 4)
mat

#> [,1] [,2] [,3] [,4]
#> [1,] 0 1 0 1
#> [2,] 1 0 1 1
#> [3,] 0 1 0 0
#> [4,] 1 1 0 0

然后可以使用 graph_from_adjacency_matrix 生成网络:

graph_from_adjacency_matrix(mat, mode = 'undirected')

#> IGRAPH bf21980 U--- 4 4 --
#> + edges from bf21980:
#> [1] 1--2 1--4 2--3 2--4

也可以生成加权网络:

生成加权矩阵:

mat1 <- matrix(c(0,2,1,1,1,0,1,4,0,1,5,0,1,1,0,0), byrow = T, ncol = 4)
mat1

#> [,1] [,2] [,3] [,4]
#> [1,] 0 2 1 1
#> [2,] 1 0 1 4
#> [3,] 0 1 5 0
#> [4,] 1 1 0 0

使用加权矩阵生成网络:

graph_from_adjacency_matrix(mat1, mode = 'undirected', weighted = T) -> g
plot(g)

第三种:使用边列表创建网络

大多数网络数据集以 edgelist 形式存储。输入为两列矩阵,每行定义一条边。

生成数据:

tibble(
x = c(1, 2, 3, 1),
y = c(2, 3, 5, 4)
) %>%
as.matrix() -> data

data

#> x y
#> [1,] 1 2
#> [2,] 2 3
#> [3,] 3 5
#> [4,] 1 4

使用 graph_from_edgelist() 生成网络:

graph_from_edgelist(data, directed = T)

#> IGRAPH b018a0c D--- 5 4 --
#> + edges from b018a0c:
#> [1] 1->2 2->3 3->5 1->4

第四种:使用 data.frame 创建网络

第二种方法和第四种方法都是使用矩阵 matrix 生成网络,igraph 也提供了使用 data.frame 格式数据生成网络的函数 graph_from_data_frame。

生成示例数据:

data.frame(
from = c("Bob", "Cecil", "Cecil",
"David","David", "Esmeralda"),
to = c("Alice", "Bob", "Alice",
"Alice", "Bob", "Alice")
) -> relations
graph_from_data_frame(relations, directed = TRUE) -> g
g

#> IGRAPH 7752a6c DN-- 5 6 --
#> + attr: name (v/c)
#> + edges from 7752a6c (vertex names):
#> [1] Bob ->Alice Cecil ->Bob Cecil ->Alice David ->Alice
#> [5] David ->Bob Esmeralda->Alice

第五种:与 pajck 的交互

网络分析经常需要跨平台交互,igraph 可以转化成 pajek 格式。

将网络保存到本地:

write_graph(g, file = "gg", format = "pajek")

将本地网络文件导入到 R:

read_graph(file = "gg", format = "pajek")

#> IGRAPH 684e8f1 D--- 5 6 --
#> + edges from 684e8f1:
#> [1] 1->5 2->1 2->5 3->5 3->1 4->5

除此之外,还可以导出为 graphml, dot, gml, edgelist, lgl, ncol 和 dimacs 几种格式,详情可以参考 ?write_graph。

该课程为免费课程,点击阅读原文即可跳转到 RStata 平台上下载本文相关的附件(课程表里面)。

点击这里跳转到 RStata 短书平台获取附件:使用 igraph 包生成网络对象的方法

评论