IGraph:直到停止节点/顶点的网络距离

Posted

技术标签:

【中文标题】IGraph:直到停止节点/顶点的网络距离【英文标题】:IGraph: network distance until stop node/vertex 【发布时间】:2018-07-20 04:29:54 【问题描述】:

我有一个igraph 网络,其中包含两种类型的节点,一组描述我感兴趣的点/节点 (NOI),另一组在我的网络中充当障碍 (B)。现在我想测量从特定NOI 开始连接的所有边的总长度,直到接近障碍物。 这是一个在igraph 中使用环形的简短示例:

set.seed(123)
g <- make_ring(10) %>%
  set_edge_attr("weight", value = rnorm(10,100,20))%>%
  set_vertex_attr("barrier", value = c(0,0,1,0,0,1,0,0,1,0))%>%
  set_vertex_attr("color", value = c("green","green","red",
                                       "green","green","red",
                                       "green","green","red","green"))

例如,从我的节点 1(NOI,绿色)开始,所有边直到节点 9 和 3 都可以到达(节点 9 和 3 是障碍 B 和块)。因此,NOI 1 的边的总连接长度是边 1--2,2--3,1--10 和 10--9 的长度/权重之和。节点 10 作为起始节点的值相同。最后,我对所有 NOI 的列表/数据框及其可达网络的总长度感兴趣。如何最好地使用igraphR 中进行? igraph中有内置函数吗?

【问题讨论】:

【参考方案1】:

这是一种可能的策略。首先,我为每个节点设置一个名称,以便在图形转换期间保留我的名称

V(g)$name = seq.int(vcount(g))

现在我放下所有的障碍,将图表分割成单独的感兴趣的连接节点,这些节点都将共享相同的长度。

gd <- g %>% induced_subgraph(V(g)[V(g)$barrier==0]) %>% decompose()

然后我们可以编写一个辅助函数,它接受一个子图并在原始图中找到子图中节点的所有事件边,提取权重,并将它们相加

get_connected_length <- function(x) 
  incident_edges(g, V(g)$name %in% V(x)$name) %>% do.call("c", .) %>% unique() %>% .$weight %>% sum()

现在我们将函数应用于每个子图并提取节点名称

n <- gd %>% Map(function(x) V(x)$name, .)
w <- gd %>% Map(get_connected_length, .)

我们可以将这些数据组合成一个矩阵

do.call("rbind", Map(cbind, n, w))
#      [,1]     [,2]
# [1,]    1 361.5366
# [2,]    2 361.5366
# [3,]   10 361.5366
# [4,]    4 335.1701
# [5,]    5 335.1701
# [6,]    7 318.2184
# [7,]    8 318.2184

【讨论】:

以上是关于IGraph:直到停止节点/顶点的网络距离的主要内容,如果未能解决你的问题,请参考以下文章

从数据帧格式化 igraph 饼图顶点值

R将egor对象转换为igraph /使用可视化应用程序(错误:重复的顶点名称)

使用igraph查找连接到顶点的所有顶点?

如何根据 igraph 中顶点的邻居属性创建顶点属性?

最短路径---迪杰斯特拉算法[图中一个顶点到其他顶点的最短距离]

迪杰斯特拉算法