首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在R中使用line.graph (图形)将顶点转换为边时计算新的边权重?

如何在R中使用line.graph (图形)将顶点转换为边时计算新的边权重?
EN

Stack Overflow用户
提问于 2015-03-06 09:12:33
回答 1查看 388关注 0票数 1

我正在尝试使用line.graph将边转换为节点。我的第一个图有每个边的权重,我试图通过以下方式获得新图的egdes上的权重:

第一张图-

1-(0.7)-2-(0.5)-3

新图形-

1,2-(0.35)-2,3

因此,第一个图的顶点是1,2和3。1-2的边权是0.7,2-3的边权是0.5。在新的图中,我有顶点(1,2)和(2,3),连接它们的边的权重为0.35,即边权重的乘积(0.7 * 0.5)。

我如何在字形中做到这一点?

EN

回答 1

Stack Overflow用户

发布于 2015-03-06 14:31:30

基本上,我将计算新图的算法总结为:

  1. 为原始图中的每条边在新图中创建节点
  2. 如果新图中的一对节点共享原始图中的一个节点(也称为映射到原始图中的相邻边),则在它们之间添加一条权重等于映射边权重的乘积的边。

我将采取的方法是遍历原始图中的节点,为新图中与该节点相邻的每对边添加一条边:

代码语言:javascript
复制
# Sample graph (from comments on original question)
library(igraph)
g <- graph.data.frame(data.frame(x=1:3, y=2:4, weight=c(0.7, 0.5, 0.2)))

# Build new graph from edge list
g.edges <- get.edges(g, E(g))
enames <- paste(g.edges[,1], g.edges[,2], sep=",")
ewts <- E(g)$weight
(new.edges <- do.call(rbind, sapply(1:vcount(g), function(x) {
  incident <- which(g.edges[,1] == x | g.edges[,2] == x)
  if (length(incident) <= 1) {
    return(NULL)
  } else {
    all.comb <- combn(incident, 2)
    return(data.frame(x=enames[all.comb[1,]], y=enames[all.comb[2,]], weight=apply(all.comb, 2, function(x) prod(ewts[x]))))
  }
})))
#     x   y weight
# 1 1,2 2,3   0.35
# 2 2,3 3,4   0.10

您可以使用graph.data.frame(new.edges)构建新的图形。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28890790

复制
相关文章

相似问题

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