【问题标题】:r create adjacency matrix or edge list from adjacency listr 从邻接列表创建邻接矩阵或边列表
【发布时间】:2025-12-15 06:35:01
【问题描述】:

我有一个邻接列表,我正在尝试将其放入邻接矩阵或边缘列表。这是为了对从邻接矩阵或边列表构建的网络进行网络分析。我正在使用 R。 邻接表示例如下(每行有不同数量的条目,空条目为NA):

[17,50,90,NA,NA;
80,67,NA,NA,NA;
33,31,32, NA,NA;
33,31,32,NA,NA;
354,56,87,97,32;
....]

我尝试使用R: Adjacency list to Adjacency matrix,但这仅在我的邻接列表有两个条目时才有效(即一个组中有两个以上的邻居)。我得到了一个边缘列表,但只考虑了我列表中的前两个条目。

我也尝试使用From list to adjacency matrix,但使用igraphmake_graph(unlist(mydata)) 导致错误:"At type_indexededgelist.c:117 : cannot create empty graph with negative number of vertices, Invalid value"

我需要一个考虑到网络中权重的邻接矩阵(例如,如果条目 31 和 32 位于两行中,则它们的边权重为 2)。 感谢您的帮助。

【问题讨论】:

    标签: r networking igraph adjacency-matrix adjacency-list


    【解决方案1】:

    我有一个邻接列表,我正在尝试将它变成一个 [...] 边缘列表。

    也许你可以这样做

    lst <- read.csv(header=F, comment.char=";", colClasses="integer", text="
    17,50,90,NA,NA;
    80,67,NA,NA,NA;
    33,31,32,NA,NA;
    33,31,32,NA,NA;
    354,56,87,97,32;")
    m <- as.matrix(lst)
    e <- stack(split(m, row(m)))[,2:1]
    (e <- e[complete.cases(e),])
    # 1    1     17
    # 2    1     50
    # 3    1     90
    # 6    2     80
    # 7    2     67
    # 11   3     33
    # 12   3     31
    # 13   3     32
    # 16   4     33
    # 17   4     31
    # 18   4     32
    # 21   5    354
    # 22   5     56
    # 23   5     87
    # 24   5     97
    # 25   5     32
    

    e <- apply(lst, 1, function(x)x[!is.na(x)])
    (e <- do.call(rbind, lapply(e, embed, 2))[,2:1])
    #      [,1] [,2]
    # [1,]   17   50
    # [2,]   50   90
    # [3,]   80   67
    # [4,]   33   31
    # [5,]   31   32
    # [6,]   33   31
    # [7,]   31   32
    # [8,]  354   56
    # [9,]   56   87
    # [10,]   87   97
    # [11,]   97   32
    

    取决于你需要什么/你的“邻接列表”代表什么。

    【讨论】:

    • 非常感谢。对于使用 apply 的第二个答案,有没有办法让一行列出第一个和第三个条目作为邻居?例如,第三行将是值 [17,90]。这将继续用于其他条目,例如在我的数据中列出第 1 个和第 8 个条目。
    • @CatalinaGutierrez 您可能想查看?expand.grid() 和/或?combn()
    • 忽略最后一条评论。更新:我尝试使用 co = combn(e[[1]],2) 的梳子,其中 e 来自使用 apply。我转换为 data.frame 并使用转置来获取边缘列表:[17,50; 17,90; 50,90] 。我能够对所有值执行此操作并获得完整的边缘列表。但是,当把它变成一个图和邻接矩阵时,我相信它会重新计算任何重复的对。我需要把它变成一个加权邻接矩阵和图。例如,如果 [17,50] 在我的边缘列表中出现两次,这意味着 17 和 50 之间的边缘的权重是 2。有任何想法吗?再次感谢您!
    • @CatalinaGutierrez 查看igraph::simplify() 以聚合多条边。