【问题标题】:igraph: discount edge weights based on node attributesigraph:基于节点属性的折扣边权重
【发布时间】:2021-04-10 07:32:51
【问题描述】:

我有一个带有边权重的无向网络。 每个节点都有一个属性“组”。 我想改变现有的权重,在同一组内的节点之间打折那些边。

例如 如果 node1 和 node2 的边权重为 10,并且它们的属性“group”都等于“A”,那么我想将权重除以 - 比如说 - 2,如果不是(它们属于不同的组),它们的权重应该剩下 10 个。

我不知道如何继续。

我可以使用 E(g)$weight 显示权重,使用 V(g)$group 显示属性,但我想不出一种方法来使用顶点属性来更改边权重。

【问题讨论】:

    标签: r igraph social-networking


    【解决方案1】:

    您可以使用igraph::%--% 运算符来提供帮助。如您的示例所示:如果两个顶点都在 A 组中,则将权重除以 2

    v_a <- which(V(g)$group == "A")  # All vertices in group A
    e_a <- E(g)[v_a %--% v_a]  # All edges between those vertices
    
    edge_attr(g)$weight[e_a] <- edge_attr(g)$weight[e_a] / 2
    

    如果每个组都以类似的方式处理,则可以使用 for 循环。在此示例中,您将权重除以某个常数,具体取决于其顶点所在的组。

    group_constants <- c("A" = 2, "B" = 20, "C" = 200)
    
    for (i in unique(V(g)$group)) {
      v_a <- which(V(g)$group == i)
      e_a <- E(g)[v_a %--% v_a]
      
      edge_attr(g)$weight[e_a] <- edge_attr(g)$weight[e_a] / group_constants[i]
    }
    

    这是我使用的数据。这是一个包含顶点组和边权重的无向图。

    verts <- letters[1:10]
    
    g_df <- data.frame(
      from = sample(verts, 15, replace = TRUE),
      to = sample(verts, 15, replace = TRUE),
      weight = sample(1:10, 15, replace = TRUE)
    )
    
    g_df_v <- data.frame(
      name = verts,
      group = sample(LETTERS[1:3], 10, replace = TRUE)
    )
    
    g <- graph_from_data_frame(g_df, directed = FALSE, vertices = g_df_v)
    
    # Edges
    #    from to weight
    # 1     h  i      5
    # 2     i  e      9
    # 3     d  i      8
    # 4     c  a     10
    # 5     f  c      7
    # 6     a  b      5
    # 7     j  i      1
    # 8     j  b      8
    # 9     a  f      4
    # 10    h  i      7
    # 11    g  a      7
    # 12    f  b      6
    # 13    e  c      8
    # 14    b  f      4
    # 15    g  c      8
    
    # Vertices
    #    name group
    # 1     a     C
    # 2     b     B
    # 3     c     C
    # 4     d     B
    # 5     e     A
    # 6     f     A
    # 7     g     A
    # 8     h     B
    # 9     i     B
    # 10    j     B
    

    【讨论】:

    • 谢谢,但是如果我有几个组并且我n次无法使用哪个功能怎么办?
    • 好的,我添加了一个更通用的部分——如果这就是你的意思,请告诉我
    猜你喜欢
    • 1970-01-01
    • 2014-10-19
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    • 2019-01-17
    • 1970-01-01
    相关资源
    最近更新 更多