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 的列表/数据框及其可达网络的总长度感兴趣。如何最好地使用igraph
在R
中进行? 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:直到停止节点/顶点的网络距离的主要内容,如果未能解决你的问题,请参考以下文章
R将egor对象转换为igraph /使用可视化应用程序(错误:重复的顶点名称)