0

给出了一个网络。

nodes <- data.frame( id = 1:8, label = paste0("Node", 1:8))
edges <- data.frame(from = from, to = to)
library(visNetwork ) # you can use anyone of igraph, rneo4j as well
visNetwork(nodes, edges)

在此处输入图像描述

当我们正在寻找连接的网络时,我们在这里得到了 2 个连接的网络(CN)。第一个 CN : (1,2,5,6,7) 和第二个 CN : (3,4,8)

我们为每个 CN 附加一个 group_id。所以第一个 CN 的每个节点的 group_id 为 1,第二个 CN 的每个节点的 group_id 为 2。

最终目标是通过使用一些算法创建一个 group_id 列。

在上述情况下,通过观察图像

 group_id <- c(1,1,2,2,1,1,1,2)
 modified_nodes <- cbind(nodes,group_id)
4

1 回答 1

1

我不熟悉visNetwork,但它似乎专注于可视化而不是图形分析。因此,我提出了一个igraph解决方案。

igraph对象可以直接从您的数据框中创建edges并绘制plot()

library(igraph)
from <- c(8, 4, 1, 2, 5, 5)
to <- c(4, 3, 2, 5, 6, 7)
edges <- data.frame(from = from, to = to)
g <- graph_from_data_frame(edges, directed = FALSE)
plot(g)

在此处输入图像描述

igraph提供许多功能来分析图形。您可以通过以下方式获取图表的各种断开连接的组件components()

components(g)
## $membership
## 8 4 1 2 5 3 6 7 
## 1 1 2 2 2 1 2 2 
## 
## $csize
## [1] 3 5
## 
## $no
## [1] 2

$membership正是你所要求的。因此,这将为您提供所有顶点的数据框以及它们所属的组件的编号:

memb <- components(g)$membership
nodes <- data.frame(id = names(memb),
                    group_id = memb)
nodes <- nodes[order(nodes$id), ]
nodes
##   id group_id
## 1  1        2
## 2  2        2
## 3  3        1
## 4  4        1
## 5  5        2
## 6  6        2
## 7  7        2
## 8  8        1

或者,您可以将该列添加group_id到您的数据框中nodes

nodes <- data.frame( id = 1:8, label = paste0("Node", 1:8))
nodes$group_id <- components(g)$membership[as.character(nodes$id)]

请注意,您需要转换nodes$id为字符以确保您实际使用名称进行索引。

于 2016-03-25T10:48:26.647 回答