如何解决igraph:基于节点属性的折扣边权重
我有一个带边权重的无向网络。 每个节点都有一个属性“组”。 我想更改现有权重,以减少同一组内节点之间的边。
例如 如果 node1 和 node2 的边权重为 10 并且它们的属性“group”都等于“A”,那么我想将权重除以 - 比方说 - 2,如果不是(它们属于不同的组)他们的权重应剩下 10 个。
我不知道如何继续。
我可以使用 E(g)$weight 和 V(g)$group 的属性来可视化权重,但是我想不出使用顶点属性来改变边权重的方法。
解决方法
您可以使用 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,weight = sample(1:10,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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。