【问题标题】:Prepare igraph input data by making id starting from one通过使 id 从 1 开始来准备 igraph 输入数据
【发布时间】:2013-04-09 21:49:27
【问题描述】:

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

提前感谢您的帮助!

【问题讨论】:

    标签: r igraph


    【解决方案1】:

    为了让 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 
    

    【讨论】:

    • 确实容易多了 :) 我错过了这个基本功能!谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-14
    • 1970-01-01
    • 2017-01-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多