基于数据框的共享属性创建邻接矩阵或列表
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, B
和 C
将相互连接,因为它们共享 red
属性。 A
和 D
将形成连接,因为它们共享 blue
属性。此外,A
和B
共享一个purple
属性。我们可以对共享多个 属性 的元素进行加权,例如 A
和 B
除了 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)
我有一个重复项目(行)的数据框,从某种意义上说,它描述了彼此共享一些 属性 的项目。我想将这种关系表示为图表。
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
除了 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)