如何在R语言中将边列表转换为邻接矩阵?
在R语言中将指定边列表转换为邻接矩阵
没问题!我来一步步带你完成这个任务,不管你想用便捷的第三方包还是纯基础R实现,都给你讲清楚。
方法一:用igraph包(推荐,简洁高效)
igraph是R里处理网络数据的神器,用它来转邻接矩阵非常省心:
- 先安装并加载igraph包(如果还没装的话):
install.packages("igraph") library(igraph)
- 准备你的边列表数据。假设你的边列表是这样的(如果是自己的真实数据,替换掉示例即可):
# 示例边列表:每一行代表两个节点之间的连接 edges <- data.frame( from = c("Kanye West", "Jay-Z", "Beyonce", "Nicki Minaj", "Kid Cudi", "Chance The Rapper"), to = c("Jay-Z", "Beyonce", "Jay-Z", "Kanye West", "Kanye West", "Kid Cudi") )
- 将边列表转换为igraph网络对象:
# directed = FALSE 表示无向图,如果是有向网络就改成TRUE g <- graph_from_data_frame(edges, directed = FALSE, vertices = c("Kanye West", "Jay-Z", "Beyonce", "Nicki Minaj", "Kid Cudi", "Chance The Rapper"))
这里的vertices参数指定了所有要包含的节点,哪怕某个节点没有边,也会被保留在邻接矩阵里。
- 提取邻接矩阵:
# sparse = FALSE 得到普通矩阵(不是稀疏矩阵),names = TRUE 保留节点名称 adj_matrix <- as_adjacency_matrix(g, type = "both", names = TRUE, sparse = FALSE)
- 查看结果:
print(adj_matrix)
方法二:纯基础R实现(无需额外包)
如果你不想用第三方包,用基础R也能搞定:
- 先定义所有节点的集合:
nodes <- c("Kanye West", "Jay-Z", "Beyonce", "Nicki Minaj", "Kid Cudi", "Chance The Rapper")
- 初始化一个全0的邻接矩阵,行和列都用节点名命名:
adj_matrix <- matrix( 0, nrow = length(nodes), ncol = length(nodes), dimnames = list(nodes, nodes) )
- 遍历边列表,填充邻接矩阵:
# 还是用刚才的示例边列表edges for(i in 1:nrow(edges)){ from <- edges$from[i] to <- edges$to[i] # 无向图:双向都设为1;如果是有向图,只保留 adj_matrix[from, to] <- 1 这一行 adj_matrix[from, to] <- 1 adj_matrix[to, from] <- 1 }
- 查看最终的邻接矩阵:
print(adj_matrix)
小提示
- 确保边列表里的节点名称和你定义的节点集合完全一致(大小写、空格都不能错),否则会出现匹配问题。
- 可以用
all(c(edges$from, edges$to) %in% nodes)检查边列表里的节点是否都在指定集合中,返回TRUE就没问题。
内容的提问来源于stack exchange,提问作者BJSP
相关产品推荐
相关产品推荐

