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