0

我有一个包含三列的数据库,前两列表示图形顶点的 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

谁能建议我一种自动完成的方法?此外,我还想为 ids 创建原始名称和新名称的转换表:

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

预先感谢您的帮助!

4

1 回答 1

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 
于 2013-04-09T13:49:27.507 回答