使用igraph和R如何找到一个顶点的边缘?

34

假设有这个示例图形,我想找到与顶点'a'相连的边

 d <- data.frame(p1=c('a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'd'),
                 p2=c('b', 'c', 'd', 'c', 'd', 'e', 'd', 'e', 'e'))

library(igraph)
g <- graph.data.frame(d, directed=FALSE)
print(g, e=TRUE, v=TRUE)

我可以轻易地找到一个顶点:

 V(g)[V(g)$name == 'a' ]

但我需要引用与顶点 'a' 相连的所有边。

4个回答

33
请参阅igraph 迭代器文档;特别是 from() 和 to() 函数。
在你的例子中,"a" 是 V(g)[0],因此要找到所有连接到 "a" 的边:
E(g) [ from(0) ]

结果:

[0] b -- a
[1] c -- a
[2] d -- a

Python-igraph用户注意:与此解决方案等效的是使用EdgeSeq的select函数,但目前存在一个错误如在此错误报告中所述。建议的解决方法是使用g.es[g.incident(x)]获取顶点X的边ID。 - Manavalan Gajapathy
1
对于非定向图,fromtoadj迭代器的行为相同,但对于有向图,需要使用adj迭代器来获取与顶点相关联的所有链接。对于有向图,from仅返回从提供的顶点开始的边;to仅返回以提供的顶点结束的边。对于有向和无向图,adj将返回与顶点相关联的所有边。 - Geoffrey Poole

7
如果您不知道顶点的索引,您可以在使用from()函数之前使用match()来找到它。
idx <- match("a", V(g)$name)
E(g) [ from(idx) ]

更简单的写法:E(g) [ to("a") ] - Geoffrey Poole

6
发现了一个更简单的版本,将上述两个努力结合起来可能也会有用。
E(g)[from(V(g)["name"])]

这给了我一个索引,但不是元组中实际的名称(源节点->目标节点)(我正在使用有向图)。 - Timbus Calin
1
我需要更多信息才能帮助你解决问题。我似乎可以提取出起点和终点节点。 require(igraph) g1 <- graph(edges=c(1,2, 2,3, 3,1), n=3, directed=T) plot(g1) E(g1)[from(V(g1)[2])]
E(g1)[to(V(g1)[2])]
  • 1/3 条边来自于74d9064: [1] 1->2
    E(g1)[from(V(g1)[2])]
  • 1/3 条边来自于74d9064: [1] 2->3
- jtclaypool
谢谢,我会在今天或接下来的几天有更多时间时尝试。 - Timbus Calin

2
我使用这个函数来获取所有节点的边数:
```python def get_num_edges(graph): return {node:len(graph[node]) for node in graph} ```
该函数可以计算出每个节点的边数。
sapply(V(g)$name, function(x) length(E(g)[from(V(g)[x])]))

当你可以使用 degree(g) 时,应该使用它。 - nJGL

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接