首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >igraph:基于节点属性的折扣边缘权重

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

Stack Overflow用户
提问于 2021-01-04 13:52:34
回答 1查看 107关注 0票数 0

我有一个没有方向的网络,边缘权值。每个节点都有一个属性"group“。我想要改变现有的权重,剔除同一组中节点之间的边。

例如,如果node1和node2的边权重为10,并且它们的属性"group“都等于"A”,那么我想将权重除以-假设-2,如果不是(它们属于不同的组),它们的权重将保持为10。

我不知道该如何进行。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-04 17:10:36

您可以使用igraph::%--%操作符来帮助您。如您的示例所示:如果两个顶点都在A组中,那么将权重除以2

代码语言:javascript
复制
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-循环。在本例中,您将权重除以某个常量,这取决于其顶点所在的组。

代码语言:javascript
复制
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]
}

这是我用过的数据。它是一个具有顶点群和边权的无向图。

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65563836

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档