2017-07-10 60 views
0

我有一個重複項目(行)的數據框,在某種意義上描述了彼此共享某些屬性的項目。我想以圖表的形式表達這種關係。根據數據幀中的共享屬性創建一個鄰接矩陣或列表

property node 
red  A 
red  B 
red  C 
blue  A 
blue  D 
purple A 
purple B 

A, BC將與彼此連接,因爲它們共享red屬性。 AD將形成連接,因爲它們共享blue屬性。此外,AB共享purple屬性。我們可以權重共享多個屬性的元素,例如,AB除了red屬性之外,還共享一個purple屬性。

我的問題是,如何使用R方便地表達這種關係,並獲得鄰接矩陣或簡單的邊緣列表。

matrix <- matrix(0,total_nodes,total_nodes) #initialize a matrix 
for (i in property) { 
    #some function to fill in the matrix 
} 

diag(matrix) <- 0 
+0

你能解釋下投票的原因是什麼? – eastafri

+0

'crossprod(表(dta))' – user20650

回答

1

瞭解您的數據:

dta <- read.table(header = TRUE, stringsAsFactors = FALSE, 
      textConnection("property node 
red  A 
red  B 
red  C 
blue  A 
blue  D 
purple A 
purple B")) 

通過數據鏈接到自己的財產從創建數據集的邊緣:

library(dplyr) 

# Create edges by linking the vertices to eachother using their properties 
dta <- full_join(dta, dta, c('property' = 'property')) %>% 
    # We no longer need property -> remove 
    select(-property) %>% 
    # Dont allow self-loops 
    filter(node.x != node.y) %>% 
    # Aggregate duplicate edges: vertices linked using multiple properties 
    group_by(node.x, node.y) %>% 
    summarise(weight = n()) 

現在我們有一個data.frame與我們邊可以創建圖表:

library(igraph) 
# Create graph 
g <- graph_from_data_frame(dta, directed = TRUE) 
# Create adjacency matrix from graph 
M <- as_adjacency_matrix(g, attr = "weight") 

另一種解決方案,以獲得鄰接矩陣,而無需使用igraph是:

library(tidyr) 
M2 <- spread(dta, node.y, weight, fill = 0) 
+0

正是我想要的!非常感謝你,特別是使用dplyr動詞! – eastafri

相關問題