R - 将二分边列表转换为单平面邻接矩阵

时间:2018-02-16 22:24:27

标签: r matrix sparse-matrix social-networking

我有一个双边边缘列表,我想将其转换为仅仅来自'来自'的单一图表。节点。由于尺寸的原因,我需要在稀疏矩阵中执行此操作。不幸的是,这意味着使用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$to值的df$from值的数量。这将是我在任何网络图中给边缘的权重。

2 个答案:

答案 0 :(得分:0)

返回稀疏的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)

答案 1 :(得分:0)

我最终使用了一些矩阵代数而不是定义的函数来得到我的结果。通过稍微改变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)