我不确定如何说出这个问题,这使得很难找到解决方案。
我有一张人物及其在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)?我已经尝试了几次,迭代图中的边缘,但我最终得到了太多的代码,这些代码不会是可接受的快速或可持续的,并且它看起来不像是一个应该很难的问题(我觉得用一种我更熟悉的语言做这种事情不会有任何问题。)
非常感谢。
答案 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