繁体   English   中英

R-将两部分边列表转换为单部分邻接矩阵

[英]R - Convert a bipartite edgelist to a unipartite adjacency matrix

我有一个双向边列表,我想将其转换为仅包含“ from”节点的单方图。 由于大小,我需要在稀疏矩阵中执行此操作。 不幸的是,这意味着使用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值。 这就是我将给任何网络图中的边的权重。

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

我最终使用了一些矩阵代数而不是定义的函数来获得结果。 通过在sparseMatrix调用周围进行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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM