通过从一个开始id来准备igraph输入数据

时间:2013-04-09 10:57:59

标签: r igraph

我有一个包含三列的数据库,前两个表示图形顶点的ID,而第三个表示它们之间的距离。

cbind(id1=c(10,10,30,12,400,30),id2=c(11,12,400,30,10,79),dist=c(1000,20000,30123,1233,20200,400))

      id1 id2  dist
[1,]  10  11  1000
[2,]  10  12 20000
[3,]  30  400 30123
[4,]  12  30  1233
[5,]  400 10 20200
[6,]  30  79   400

为了让igraph包读取这样的数据,顶点id需要是连续的并且从一个开始。所以像这样:

    id1 id2  dist
[1,]  1  2  1000
[2,]  1  3 20000
[3,]  4  5 30123
[4,]  3  4  1233
[5,]  5  1 20200
[6,]  4  6   400

任何人都可以建议我自动执行此操作吗? 另外,我还想创建包含id的原始名称和新名称的转换表:

    old_id new_id
[1,]    1    1
[2,]   11    2
[3,]   12    3
[4,]   30    4
[5,]  400    5
[6,]   79    6

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

  

为了让igraph包读取这样的数据,顶点id需要是连续的并从一开始。

实际上并非完全正确,您可以使用符号ID:

library(igraph)

mat <- cbind(id1 =c(10,  10,   30,   12,  400,  30),
             id2 =c(11,  12,   400,  30,  10,   79),
             dist=c(1000,20000,30123,1233,20200,400))
g <- graph.data.frame(as.data.frame(mat))

g
# IGRAPH DN-- 6 6 -- 
# + attr: name (v/c), dist (e/n)

V(g)$name
# [1] "10"  "30"  "12"  "400" "11"  "79" 

str(g)
# IGRAPH DN-- 6 6 -- 
# + attr: name (v/c), dist (e/n)
# + edges (vertex names):
# [1] 10 ->11  10 ->12  30 ->400 12 ->30  400->10  30 ->79