给出了一个网络。
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)
我们将group_id附加到每个CN。所以 第一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)
答案 0 :(得分: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
转换为字符,以确保您实际使用名称进行索引。