2016-04-02 136 views
0

我有一個這樣的名單:從列表中鄰接矩陣

> print(list) 
[[1]] 
[1] 1 

[[2]] 
[1] 4 

[[3]] 
[1] 1 

[[4]] 
[1] 2 

[[5]] 
[1] 2 

[[6]] 
[1] 3 

[[7]] 
[1] 2 

[[8]] 
[1] 5 

[[9]] 
[1] 1 

[[10]] 
[1] 2 

[[11]] 
[1] 3 

[[12]] 
[1] 7 

[[13]] 
[1] 3 

[[14]] 
[1] 4 

[[15]] 
[1] 3 

[[16]] 
[1] 5 

[[17]] 
[1] 1 

[[18]] 
[1] 1 

[[19]] 
[1] 4 

[[20]] 
[1] 6 

現在我想要把這個列表爲鄰接矩陣,這樣我可以再建一個圖形undirect不是簡單的(有可能是多鏈路和selfloops)。

此列表應該在對被讀取,即,(1 4)指示存在從節點1到節點4的鏈接時,所述一對(1 2)指示存在從節點1到節點2的鏈路,等等

我該怎麼做?

我以爲我用for循環step = 2遍歷列表,但我還沒有找到如何做。 而我不知道如何分配矩陣的值,我分配給多重鏈接?

非常感謝

+0

你可以讓一個邊列表很容易與'矩陣(不公開(名單),NcoI位= 2)'你使用像'igraph'圖書館嗎?我不完全明白期望的輸出是什麼。 – MrFlick

+0

@MrFlick謝謝你的回覆。是的,我正在使用igraph。不,我沒有矩陣。我只有代表鏈接的列表(當成對閱讀時)。我沒有從數組或圖表生成列表。我所擁有的就是那個清單。 – marielle

回答

0

這裏的另一種方式

lst <- list(1, 4, 1, 2, 2, 3, 2, 5, 1, 2, 3, 7, 3, 4, 3, 5, 1, 1, 4, 6) 
library(igraph) 
g <- make_graph(unlist(lst), directed = F) 
(m <- as_adjacency_matrix(g, sparse = F)) 
#  [,1] [,2] [,3] [,4] [,5] [,6] [,7] 
# [1,] 1 2 0 1 0 0 0 
# [2,] 2 0 1 0 1 0 0 
# [3,] 0 1 0 1 1 0 1 
# [4,] 1 0 1 0 0 1 0 
# [5,] 0 1 1 0 0 0 0 
# [6,] 0 0 0 1 0 0 0 
# [7,] 0 0 1 0 0 0 0 
0

我懷疑這樣的事情是你在找什麼:

# Input 
my_list <- list(1, 4, 1, 2, 2, 3, 2, 5, 1, 2, 3, 7, 3, 4, 3, 5, 1, 1, 4, 6) 

# Make to vector 
my_list <- unlist(my_list) 

# Number of vertices in graph (may change this to any number > max(my_list)) 
num_vertices <- max(my_list) 

# Number of edges 
num_edges <- length(my_list)/2 

# Transform edge data into data.frame, each row is an edge 
edges <- data.frame(tails = my_list[rep(c(TRUE, FALSE), num_edges)], 
        heads = my_list[!rep(c(TRUE, FALSE), num_edges)]) 

# Count duplicate edges (if multi-edges should not be allowed, set count to 1) 
edges$count <- ave(rep(1, num_edges), edges, FUN = base::sum) 

# Remove duplicate edges, count encodes multi-edges 
edges <- edges[!duplicated(edges), ] 

# Make empty adjacency matrix 
adjacency_matrix <- matrix(0, ncol = num_vertices, nrow = num_vertices) 

# Populate matrix 
adjacency_matrix[as.matrix(edges[, c("heads", "tails")])] <- edges$count 

# Make graph undirected 
adjacency_matrix <- adjacency_matrix + t(adjacency_matrix) - diag(diag(adjacency_matrix)) 

順便說一句,list可能不是一個列表最好的名字。

+0

我得到這個錯誤'錯誤在獲取(as.character(FUN),mode =「function」,envir = envir):沒有找到'function'的模式'function'的對象' – marielle

+0

@marielle您可能已經覆蓋了'總和「功能。 R可以讓你基本上覆蓋任何可以使代碼不可預測的東西,就像在這種情況下一樣。試着用'邊緣$ count < - ave(rep(1,num_edges),邊緣,FUN = base :: sum)'代替。我也改變了原來的代碼。 –