我有一个没有方向的网络,边缘权值。每个节点都有一个属性"group“。我想要改变现有的权重,剔除同一组中节点之间的边。
例如,如果node1和node2的边权重为10,并且它们的属性"group“都等于"A”,那么我想将权重除以-假设-2,如果不是(它们属于不同的组),它们的权重将保持为10。
我不知道该如何进行。
我可以用E(g)$weight可视化权重,用V(g)$group显示属性,但我想不出用顶点属性改变边权重的方法。
发布于 2021-01-04 17:10:36
您可以使用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 Bhttps://stackoverflow.com/questions/65563836
复制相似问题