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

Create an adjacency matrix or list based on shared properties from a data-frame

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

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 属性 =31=]。

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

读取您的数据:

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)