从部分信息生成完整的邻接矩阵

producing a full adjacency matrix from partial information

have 一个包含构造 5x5 邻接矩阵所需的所有信息的矩阵。每行代表一个矩阵:

     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,]    1    1    1    1    1    1    1    0    1     0
[2,]    0    0    0    1    1    1    1    0    1     0
...

I want 从第 n 行数据创建邻接矩阵。对于 have 的第一行,want 矩阵如下所示:

     [,1] [,2] [,3] [,4] [,5]
[1,]    0    1    1    1    1
[2,]    1    0    1    1    1
[3,]    1    1    0    0    1
[4,]    1    1    0    0    0
[5,]    1    1    1    0    0

如何从 havewant

这是一个使用 lower.triupper.tri

的选项
unlist(apply(mat, 1, function(x) {
    m <- matrix(0, nrow = 5, ncol = 5)
    m[lower.tri(m)] <- x
    m[upper.tri(m)] <- x
    list(m)
}), recursive = F)
#[[1]]
#     [,1] [,2] [,3] [,4] [,5]
#[1,]    0    1    1    1    1
#[2,]    1    0    1    1    0
#[3,]    1    1    0    1    1
#[4,]    1    1    0    0    0
#[5,]    1    1    1    0    0
#
#[[2]]
#     [,1] [,2] [,3] [,4] [,5]
#[1,]    0    0    0    1    1
#[2,]    0    0    0    1    0
#[3,]    0    1    0    1    1
#[4,]    0    1    0    0    0
#[5,]    1    1    1    0    0

unlist(..., recursive = F) 部分看起来有些笨拙,但对于防止 apply 简化结果和丢弃 dims 是必要的。另一种方法是在 data.frame 上使用 lapply 而不是 matrix:

lapply(as.data.frame(t(mat)), function(x) {
    m <- matrix(0, nrow = 5, ncol = 5)
    m[lower.tri(m)] <- x
    m[upper.tri(m)] <- x
    return(m)
})

给出相同的结果。


示例数据

mat <- as.matrix(read.table(text =
"1    1    1    1    1    1    1    0    1     0
0    0    0    1    1    1    1    0    1     0", header = F))
colnames(mat) <- NULL