【问题标题】:Mapping edgelists to an adjacency matrix (and sum them together)将边缘列表映射到邻接矩阵(并将它们相加)
【发布时间】:2019-04-18 13:36:02
【问题描述】:

我想使用R 将多个(无向)友谊网络(以边缘列表格式)映射到由所有可能节点(即人)组成的邻接矩阵。首先,我构建了一个较小的 4 人圆 x <- c(1, 2, 3, 4),它由 6 个独特的边(1-2、1-3、1-4、2-3、2-4、3-4)组成。然后我将这组 6 条独特的边合并到一个列表中,以便可以使用 igraph 应用程序将其转换为对称矩阵(见下文)。

x = c(1,2,3,4)
x_pairs = combn(x, 2)
List <- split(x_pairs, rep(1:ncol(x_pairs), each = nrow(x_pairs)))
library(purrr)
new_list <- purrr::flatten(List)
g <- make_graph(unlist(new_list), directed = F)
m <- as_adjacency_matrix(g, sparse = F)
m

     [,1] [,2] [,3] [,4]
[1,]    0    1    1    1
[2,]    1    0    1    1
[3,]    1    1    0    1
[4,]    1    1    1    0

我的数据集有不止一个这样的小型友谊圈,由总共 50 人中的成员组成,这些圈子的成员可能会重叠,也可能不会重叠。所以我的问题是如何以两种不同的方式将一系列较小的矩阵值(如上面的 m)映射到 50 x 50 邻接矩阵:

(1) 不重复:比如说,如果 3 和 4 是一个圈子里的朋友,但他们又在另一个圈子里有联系,那么 3 和 4 之间的边应该保持为 1(但加起来不等于 2) (2) 累积:如果多个圈子中的关系表明友谊更强,那么将这些圈子映射到加权邻接矩阵中可能会提供更多信息,其中矩阵中的每个单元格代表不同圈子中行和列 id 的友谊的累积计数。在 3 和 4 的情况下,它们的边缘值应该是 1 + 1 = 2。

我已经查看了this 和其他以前的帖子,但似乎无法弄清楚如何做到这一点,如果有人能就此给予我启发,我将不胜感激。

【问题讨论】:

    标签: r igraph adjacency-matrix weighted-graph


    【解决方案1】:

    有多种方法可以实现它。看起来在igraph 中用图论术语来做这件事比直接处理邻接矩阵要繁琐一些。让

    circles <- list(1:3, 2:4) # Friendship circles with identities 1, ..., n
    n <- max(unlist(circles)) # Total number of people
    nM <- matrix(0, n, n) # n x n matrix of zeroes
    

    然后

    adjs <- lapply(circles, function(cr) {nM[cr, cr] <- 1; nM[cbind(cr, cr)] <- 0; nM})
    

    是每个友谊圈的 n x n 邻接矩阵的列表(在每种情况下大多为零)。

    那么可以得到这两类聚合矩阵

    (adj1 <- Reduce(`+`, adjs))
    #      [,1] [,2] [,3] [,4]
    # [1,]    0    1    1    0
    # [2,]    1    0    2    1
    # [3,]    1    2    0    1
    # [4,]    0    1    1    0
    (adj2 <- 1 * (adj1 > 0))
    #      [,1] [,2] [,3] [,4]
    # [1,]    0    1    1    0
    # [2,]    1    0    1    1
    # [3,]    1    1    0    1
    # [4,]    0    1    1    0
    

    【讨论】:

    • @ChrisT.,它回答了您的问题还是您正在寻找不同的方法?
    猜你喜欢
    • 2019-09-07
    • 1970-01-01
    • 2019-04-19
    • 2014-09-04
    • 2017-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-19
    相关资源
    最近更新 更多