代码之家  ›  专栏  ›  技术社区  ›  Chris T.

将边列表映射到邻接矩阵(并将它们相加)

  •  1
  • Chris T.  · 技术社区  · 6 年前

    我想把许多(无向的)友谊网络(edgelist格式)映射到一个邻接矩阵,该矩阵由所有可能的节点(即人)组成,使用 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×50邻接矩阵:

    (1) 无需重复:比如说,如果3和4是一个圈中的朋友,但它们也连接在另一个圈中,那么3和4之间的边应该保持1(但不等于2) (2) 累积:如果多个圆中的关系表示友谊更强,那么将这些圆映射到加权邻接矩阵中可能更有用,矩阵中的每个单元格表示不同圆中行和列id的友谊的累积计数。在3和4的情况下,它们的边值应该是1+1=2。

    我已经退房了 this 和其他以前的线程,但似乎不知道如何做到这一点,如果有人能启发我这将是非常感谢。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Julius Vainora    6 年前

    实现这一目标的方法多种多样。它看起来像是用图论的术语 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