根据数据框中的共享属性创建邻接矩阵或列表

时间:2017-07-10 03:46:47

标签: r matrix graph igraph adjacency-matrix

我有一个重复项(行)的数据框,在某种意义上描述了彼此共享某些属性的项。我想将这种关系表达为图表。

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

A, BC会相互关联,因为它们共享red属性。 AD会形成连接,因为它们共享blue属性。此外,AB共享purple属性。我们可以对共享多个属性的元素进行加权,例如AB除了purple属性之外还共享red属性。

我的问题是,如何使用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

1 个答案:

答案 0 :(得分:2)

阅读您的数据:

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)