2013-04-09 1 views
0

У меня есть база данных с тремя столбцами, первые два представляют собой идентификатор вершины графа, тогда как третий представляет собой расстояние между ними.Подготовьте входные данные 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 3
[4,] 12 30 1233 
[5,] 400 10 20200 
[6,] 30 79 400 

Для того, чтобы пакет igraph читать такие данные, вершинные идентификаторы должны быть последовательными и, начиная с одной. Так что-то вроде этого:

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

Может ли кто-нибудь предложить мне способ сделать это автоматически? Кроме того, я также хотел бы создать таблицу преобразования как с оригиналом и новым именем для идентификаторов:

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

Заранее спасибо за помощь!

ответ

0

Для того, чтобы пакет igraph считывал такие данные, идентификаторы вершин должны быть последовательными и начинаться с одного.

Это на самом деле не совсем верно, вы можете использовать символические идентификаторы:

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 
+0

Гораздо проще на самом деле :) Я пропустил эту основную функцию! благодаря – Oritteropus