【问题标题】:R - Convert a bipartite edgelist to a unipartite adjacency matrixR - 将二部边缘列表转换为单部邻接矩阵
【发布时间】:2018-02-16 22:24:26
【问题描述】:

我有一个二分边列表,我想将其转换为仅包含“来自”节点的单分图。由于大小,我需要在稀疏矩阵中执行此操作。不幸的是,这意味着更简单的解决方案(例如使用bipartite.projection(graph))会冻结所有内容。我的数据如下:

To          From     Weight
A1          B2       1
A1          B3       1
A2          B2       1
A3          B3       1
A3          B4       1
A4          B2       1
A4          B3       1

使用 Matrix 包,我创建了一个具有正确尺寸的稀疏矩阵,但由于某种原因,只填充了对角线。对于我使用的稀疏矩阵:

myMat <- sparseMatrix(as.integer(as.factor(df$from), 
                      as.integer(as.factor(df$from),
                      x = df$weight,
                      dimnames = list(levels(as.factor(df$from)),
                                      levels(as.factor(df$from))
                                     ) 
                      )

返回:

   B2  B3  B4
B2  2  .   .
B3  .  2   .
B4  .  .   1

对角线对权重求和,但矩阵的其余部分是空的,我期望它也填充了总和权重。

我想要的是:

   B2  B3  B4
B2  .  2   .
B3  2  .   1
B4  .  1   .

因为这是二分图一侧的矩阵,matrix[i,j] 表示连接任意两个 df$from 值的 df$to 值的计数。这将是我赋予任何网络图中边的权重。

【问题讨论】:

    标签: r matrix sparse-matrix social-networking


    【解决方案1】:

    返回稀疏的as_adjacency_matrix 怎么样?

    library(igraph)
    df <- read.table(textConnection("
    To          From     Weight
    A1          B2       1
    A1          B3       1
    A2          B2       1
    A3          B3       1
    A3          B4       1"), header=T, stringsAsFactors=F)
    
    g <- graph.data.frame(df[,1:2])
    V(g)$type <- V(g)$name %in% df[,1]
    
    is.bipartite(g)
    as_adjacency_matrix(g)
    

    【讨论】:

    • 这几乎可以工作,但它返回二分图的稀疏矩阵,我想将图简化为“来自”节点。
    【解决方案2】:

    我最终使用了一些矩阵代数而不是定义的函数来获得我的结果。通过更改 sparseMatrix 调用一点点,然后乘以转置,我得到了我正在寻找的矩阵

    myMat <- sparseMatrix(as.integer(as.factor(df$from), 
                      as.integer(as.factor(df$to),
                      x = 1,
                      dimnames = list(levels(as.factor(df$from)),
                                      levels(as.factor(df$to))
                                     ) 
                      )
    
    finalMat <- myMat %*% t(myMat)
    

    【讨论】:

      猜你喜欢
      • 2014-09-04
      • 2020-08-19
      • 1970-01-01
      • 2017-08-06
      • 1970-01-01
      • 2019-12-19
      • 1970-01-01
      • 1970-01-01
      • 2019-02-16
      相关资源
      最近更新 更多