如何获得将顶点转换为顶点类别的新图形?

时间:2015-02-07 18:12:31

标签: r igraph

我不确定如何说出这个问题,这使得很难找到解决方案。

我有一张人物及其在igraph中的关系图。我也在数据框中拥有这些人的位置。

> # graph.id is their id in the graph
> people
    user.name   graph.id    location.cell
1   perez       654         54
2   garcia      123         54
3   fernandez   771         32
4   rodriguez   11          81

我的图表通过他们的graph.id连接用户:

user 654 <-> user 11
user 123 <-> user 11

我想要一个带有区域的新图表,带有

cell 54 <- weight 2-> cell 81

(there are two connections between cells 54 and 81, 
 one between users 11 and 654, 
 and another between users 11 and 123,
 so weight=2)

我怎样才能在R中这样做(我正在使用igraph)?我已经尝试了几次,迭代图中的边缘,但我最终得到了太多的代码,这些代码不会是可接受的快速或可持续的,并且它看起来不像是一个应该很难的问题(我觉得用一种我更熟悉的语言做这种事情不会有任何问题。)

非常感谢。

1 个答案:

答案 0 :(得分:1)

您可以使用graph.data.frame中的igraph功能执行此操作,根据与当前图表中每条边相关联的区域创建新图表。

首先,这是您要描述的设置:

# 654 <-> 11; 123 <-> 11; 123 <-> 771
library(igraph)
g <- graph.data.frame(cbind(c(654, 123, 123), c(11, 11, 771)))
people <- data.frame(graph.id=c(654, 123, 771, 11), location.cell=c(54, 54, 32, 81))

现在,您可以将每个顶点的位置存储在g中,并使用该顶点属性来获取每个边缘端点的位置:

V(g)$location <- people$location.cell[match(V(g)$name, people$graph.id)]
g2 <- graph.data.frame(cbind(V(g)$location[get.edges(g, E(g))[,1]],
                             V(g)$location[get.edges(g, E(g))[,2]]), directed=F)
E(g2)
# str(g2)
# IGRAPH UN-- 3 3 -- 
# + attr: name (v/c)
# + edges (vertex names):
# [1] 54--81 54--81 54--32

要将多个边缘转换为权重较高的单个边缘,您可以使用simplify

E(g2)$weight <- 1
g2 <- simplify(g2)
str(g2)
# IGRAPH UNW- 3 2 -- 
# + attr: name (v/c), weight (e/n)
# + edges (vertex names):
# [1] 54--81 54--32
E(g2)$weight
# [1] 2 1