2012-10-21 24 views
12

Tôi đang làm việc với igraph cho R. Biểu đồ của tôi dựa trên một edgelist bao gồm các cạnh song song (nhiều hơn một cạnh với cùng một nguồn và đích). Tôi muốn chuyển đổi các cạnh song song này thành trọng số thuộc tính cạnh. Có cách nào để làm điều này không?R igraph chuyển đổi các cạnh song song thành thuộc tính trọng số

Nếu không có cách nào dễ dàng. làm thế nào tôi có thể xác định các cạnh song song này?

duplicated(E(net)) 

không trả về một bản sao đơn lẻ. Tôi cho rằng nó đang tìm kiếm các id cạnh trùng lặp.

Trả lời

21

Bạn cũng có thể sử dụng E(graph)$weight <- 1 theo sau là simplify(graph, edge.attr.comb=list(weight="sum")) để gán trọng số 1 cho mỗi cạnh và sau đó thu gọn nhiều cạnh thành các cạnh đơn lẻ trong khi tính tổng trọng số.

+2

Giải pháp này thực sự tốt hơn nhiều, vì nó sử dụng không gian và thời gian tuyến tính, trong khi giải pháp ma trận kề sử dụng không gian và thời gian bậc hai (theo số lượng đỉnh). –

+1

Btw. điều này cũng loại bỏ các cạnh của vòng lặp, vì vậy nếu bạn không muốn, hãy sử dụng đối số 'remove.loops = FALSE' để' simplify() '. –

4

Nó dường như xuất khẩu một đồ thị không trọng số với các cạnh song song với một ma trận kề trong igraph tạo ra một danh sách trọng với số cạnh như cân nặng, mà sau đó có thể được đọc một lần nữa:

library("igraph") 
E <- matrix(c(1,1,1,2,2,2),3,2) 
G <- graph.edgelist(E) 

G2 <- graph.adjacency(get.adjacency(G),weighted=TRUE) 
+0

Đây là một giải pháp thực sự hữu ích cho các đồ thị rất lớn . – timothyjgraham

0

Trong trường hợp bạn muốn nhận được số cạnh song song của một đồ thị mà không cần thêm một thuộc tính trọng lượng để đồ thị của bạn, bạn có thể sử dụng chức năng sau:

duplicated <- function(graph){ 
    g_local <- graph 
    E(g_local)$weight <- 1 
    g_simp <- simplify(g_local, edge.attr.comb=list(weight="sum")) 
    w <- E(g_simp)$weight 
    return(sum(w-1)) 
}