社会网络构建

该文介绍了如何利用R语言中的igraph包来构建社会网络,包括自定义无向和有向网络、通过数据框和矩阵创建网络、快速创建网络以及进行图的操作,如节点和边的添加、删除等。此外,还展示了如何从邻接矩阵和数据框转化成图对象,并对节点和边的属性进行处理。
摘要由CSDN通过智能技术生成

社会网络构建

本文使用igraph包构建社会网络,并介绍几种常见的构建方法

1 安装

# igraph包与社会网络
# install.packages("igraph")
# install.packages("tidyverse")
library("igraph")
library("tidyverse")

2 自定义

自定义方法使用graph.formula函数

# 网络图创建
# 1 自定义无向网络
g1 <- graph.formula("A"-"B","A"-"C","A"-"D","A"-"E","C"-"D") 
print(g1) # 查看网络信息
plot(g1) # 可视化

查看节点(数)、连边(数)

V(g1) # 查看节点
vcount(g1) # 节点数量

E(g1) # 查看连边
ecount(g1) # 连边数量

构建无向网络

# 自定义有向网络
g2 <- graph.formula("A"-+"B","A"+-"C","A"+-"D","A"-+"E","C"+-+"D") 
plot(g2)

节点名称修改

# 节点名修改
V(g2)$name <- c("张三","李四","王五","Bob","Mary")
plot(g2)

获取邻接矩阵

# 获取邻接表
matrix <- get.adjacency(g2,sparse = TRUE)
print(matrix)

3 数据框

使用数据框构建需要定义节点数据框和连边数据框,节点属性和连边属性可以定义各自数据框中,也可以在构建图对象后再添加各自属性。

# 连边、节点形式
V_number = 20 # 节点数量
E_number = 15 # 连边数量

name <- LETTERS[1:V_number] # 节点名称
attr1 <- rnorm(V_number,5,5) # 节点属性1
attr2 <- rnorm(V_number,10,5) # 节点属性2

# 节点及节点属性数据框
vertes <- data.frame(vertex = name,attr1 = attr1,attr2 = attr2) 

# 连边及边属性数据框
edges <- data.frame(from = sample(name,E_number,replace = TRUE),
                    to = sample(name,E_number,replace = TRUE),
                    weight = runif(E_number,min = 0,max = 100))

# 将节点、连边转化为图对象
G <- graph_from_data_frame(d = edges, directed = TRUE,vertices=vertes) 
plot(G)

在构建图对象后添加属性、节点颜色

# 在图对象中添加属性
V(G)$attr3 <- letters[1:V_number]
V(G)$attr3

# 节点颜色
V(G)$color <- "red"
plot(G)

4 矩阵

矩阵转化为图对象需要保证矩阵是方阵,如果是0-1矩阵则为无权重,如果其他元素则为加权。

# 邻接矩阵转化为图对象
# 0-1矩阵表示无权重
mygraph2 <- sample(c(0,1),25,replace = TRUE) %>% 
  matrix(nrow = 5,byrow = TRUE) %>% 
  graph_from_adjacency_matrix(mode = "directed")
plot(mygraph2)

文本矩阵也可以转化为图

# 文本矩阵转化图对象
matrix( letters[1:20], nc = 2, byrow = TRUE) %>% 
  graph_from_edgelist() %>% 
  plot()

5 快速创建

# 快速创建网络
graph_from_literal(A-B) %>% 
  plot()
graph_from_literal( A--B, C--D, E--F, G--H, I, J, K ) %>% 
  plot() # 无向
graph_from_literal( A -+ B -+ C ) %>% 
  plot() # 有向
graph_from_literal(A:B:C -- H:I:G ) %>% 
  plot()  # 二部图
graph_from_literal( A +-+ B +---+ C ++ D + E) %>% 
  plot()

6 一些简单图

# 创建经典图
make_full_graph(8) %>% 
  plot() # 完全图

make_tree(n = 20,children =  2,mode = "undirected") %>% 
  plot() # 树 每个节点有两个子节点

make_star(10, mode = "undirected") %>% 
  plot() # 星图

make_ring(8, directed = TRUE, mutual = TRUE) %>% 
  plot() # 环图

7 图操作

# 图操作
plot(mygraph2)
induced.subgraph(mygraph2,1:3) %>% plot() #提取指定节点所在图
(mygraph2 - vertices(c(1,2))) %>% plot() # 删除指定节点后的图
(mygraph2 + vertices(c(7,8))) %>% plot() # 添加节点后的图
(mygraph2 - edges(c(1,2),c(1,3))) %>% plot() # 删除指定边后的图

# 图运算
graph1 <- make_star(20, mode = "out") 
graph2 <- make_ring(20, directed = TRUE, mutual = TRUE) 
graph.union(graph1,graph2) %>% plot() # 图并运算

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值