簡體   English   中英

igraph從鄰接表生成鄰接矩陣

[英]igraph generate adjacency matrix from adjacency list

我在鄰接表中有友誼數據。 樣本中的每個人(用id表示)最多可以提名5個朋友(f1-f5)。 名為“ net_test”的數據幀如下所示:

    id   f1   f2   f3   f4   f5
1  1101 1113 1112   NA   NA   NA
2  1102 1111 1113 1103 1105   NA
3  1103 1105 1110   NA   NA   NA
4  1104 1115 1106 1110 1109 1112
5  1105 1103 1109 1116 1101   NA
6  1106 1121 1103 1113   NA   NA
7  1107 1106 1111   NA   NA   NA
8  1108 1104 1109   NA   NA   NA
9  1109 1114 1103 1113 1108 1120
10 1110 1101 1103 1109 1107   NA

第一行是列號。 根據這些數據,我想生成一個ID為行和列名的鄰接矩陣,如果兩個ID之間具有友情鏈接,則為1。 我嘗試先將其保存為圖形,然后在第二步中生成鄰接矩陣:

require(igraph)
netdat<-graph.adjlist(net_test, mode="out", duplicate=FALSE)
adjmat <- get.adjacency(netdat, type="both")

當我應用graph.adjlist命令時,發生以下錯誤:

At structure_generators.c:84 : Invalid (negative) vertex id, Invalid vertex id

是否有另一種方法可以將鄰接表轉換成鄰接矩陣?

您誤解了命令。 命令get.adjlist將igraph圖形對象作為參數,並返回圖形的列表類型對象表示形式。 您正在將此應用到未強制到igraph對象的數據框。

以下是使用數據框構造igraph圖形對象的正確方法,以及如何獲取該對象的各種圖形表示形式。

require(reshape2)
net_list <- melt( net_test, id.vars = "id")
net_list <- net_list[ !is.na(net_list$value), c("id", "value") ]
graph_o <- graph.data.frame(net_list) #This is a proper igraph graph object
#got from a data frame directly

list_rep <- get.adjlist(graph_o) #this now returns an adjacency list 
#representation of your graph
matrix_rep <- get.adjacency(graph_o) #this gives you the adjacency
#matrix as a (sparse) matrix with the row and column names as you want.

我猜問題是, net_test不是適當的鄰接列表,因為它包含的不僅僅是兩列。 因此,我要做的第一件事就是通過融化將其轉換為這種形式:

require(reshape2)
net_list <- melt( net_test, id.vars = "id")
net_list <- net_list[ !is.na(net_list$value), c("id", "value") ]
colnames(net_list) <- c("from", "to")
graph.adjlist(net_list, mode="out", duplicate=FALSE)

# IGRAPH D--- 1121 66 --

如果你只需要鄰接矩陣,並沒有進一步需要的igraph,你可以直接cast熔融net_list

acast(net_list, from ~ to, fun.aggregate = length )

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM