【问题标题】:igraph edge between two verticesigraph 两个顶点之间的边
【发布时间】:2012-10-09 11:35:01
【问题描述】:

我是 R 和 igraph 的新手,我想知道是否有人可以帮助我解决以下问题。

我想在图中找到两个顶点之间的边权重。我的图结构由正常的自我(node1)、alter(节点2)和它们之间的边的权重定义。

我知道我可以使用 E(igraph_friendship) [ from(5) ]$weight 获得源自节点 5 的边列表中每个边的权重 并且我可以使用 E(igraph_friendship) [ to(10) ]$weight

找到结束到节点号 10 的边列表中每个边的权重

但是,如果我只想找到仅连接节点 5 和节点 10 的边的权重怎么办?

或者,如果我可以在所有边列表中获得连接节点 5 和 10 的边的标识符 E(igraph_friendship),那也可以。

非常感谢您的帮助,我一直在寻找它,非常感谢您的帮助!

【问题讨论】:

  • 欢迎来到 SO!如果不是太难,请考虑给reproducible example,因为它会大大增加您获得答案的机会。

标签: r graph igraph social-graph sna


【解决方案1】:

这在 igraph 0.6 及更高版本中实际上很容易,因为你可以 将图视为邻接矩阵(或加权邻接 你的情况下的矩阵):

library(igraph)
g <- graph.ring(10)
g[1,2]
# [1] 1
E(g)$weight <- runif(ecount(g))
g[1,2]
# [1] 0.8115639

如果你想为整个矩阵做这个,那么你可以简单地做

g[]

或者,如果你不想要稀疏矩阵,那么

g[sparse=FALSE]

更多信息请查看?"[.igraph"

【讨论】:

  • 这有帮助。但是,我花了一段时间才弄清楚如何将带有权重的边缘列表放入邻接矩阵。我尝试使用 graph.data.frame 以通常的方式执行此操作,但是当我尝试将 igraph 对象转换为邻接矩阵时会出现奇怪的错误(错误:.M.kind(x) 中的错误:尚未为矩阵实现w/ typeof 字符)。这篇文章帮助解决了这个问题:sites.google.com/site/daishizuka/toolkits/sna/…。我从电子邮件列表中发现最有效的方法是直接在 igraph 对象上使用这个简单的运算符:E(g)[5 %--% 10]$weight
  • 我相信你会遇到这个错误:bugs.launchpad.net/igraph/+bug/1025799 如果可以的话,解决方法是通过在get.adjacency() 中设置sparse=FALSE 来使邻接矩阵密集。或者你可以在调用graph.data.frame()之前将你的字符(=字符串)属性转换为数字(它是边缘权重,对吗?)。
【解决方案2】:

Gabor 对邻接矩阵的使用有所帮助。但是,我花了一段时间才弄清楚如何将带有权重的边缘列表放入邻接矩阵中。我尝试使用 graph.data.frame 以通常的方式执行此操作,但是当我尝试将 igraph 对象转换为邻接矩阵时会出现奇怪的错误(错误:.M.kind(x) 中的错误:尚未为矩阵实现w/ typeof 字符)。这篇文章帮助解决了这个问题:https://sites.google.com/site/daishizuka/toolkits/sna/weighted-edgelists

但是,我从 R 帮助电子邮件列表中发现,最有效的方法是直接在 igraph 对象上使用这个简单的运算符:E(g)[5 %--% 10]$weight。详情见http://igraph.sourceforge.net/doc/R/iterators.html

【讨论】:

  • 如果您想对整个矩阵执行此操作,那么您通常可以只执行 g[] 并为您提供(加权)邻接矩阵。如果您使用稀疏矩阵(igraph 中的默认值),那么它仅在您的权重为数字时才有效。我在我的回答中扩展了这个例子。
猜你喜欢
  • 2022-11-14
  • 2016-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-27
  • 2018-04-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多