【问题标题】:IGraph: network distance until stop node/vertexIGraph:直到停止节点/顶点的网络距离
【发布时间】: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中有内置函数吗?

【问题讨论】:

    标签: r nodes igraph social-networking


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2015-11-20
      • 2021-07-09
      • 2018-08-31
      • 2021-05-05
      • 1970-01-01
      • 1970-01-01
      • 2017-12-02
      • 2012-10-31
      • 1970-01-01
      相关资源
      最近更新 更多