我有一个重复项(行)的数据框,在某种意义上描述了彼此共享某些属性的项。我想将这种关系表达为图表。
property node
red A
red B
red C
blue A
blue D
purple A
purple B
A, B
和C
会相互关联,因为它们共享red
属性。 A
和D
会形成连接,因为它们共享blue
属性。此外,A
和B
共享purple
属性。我们可以对共享多个属性的元素进行加权,例如A
和B
除了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
答案 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)