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

时间:2018-02-09 11:52:20

标签: r nodes igraph social-networking

我有一个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"))

enter image description here

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

1 个答案:

答案 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