我有一个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的列表/数据框及其可达网络的总长度感兴趣。如何使用R
在igraph
进行最佳操作? igraph
中是否有内置函数?
答案 0 :(得分:0)
这是一种可能的策略。首先,我为每个节点设置了一个名称,因此我将在图形转换期间保留
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