![](/img/trans.png)
[英]R igraph - Convert a weighted adjacency matrix into weighted edgelist
[英]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.