igraph:基于节点属性的折扣边权重

时间:2021-01-04 13:52:34

标签: r igraph social-networking

我有一个带边权重的无向网络。 每个节点都有一个属性“组”。 我想更改现有权重,以减少同一组内节点之间的边。

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

我不知道如何继续。

我可以使用 E(g)$weight 和 V(g)$group 的属性来可视化权重,但是我想不出使用顶点属性来改变边权重的方法。

1 个答案:

答案 0 :(得分: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
相关问题