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

问题描述 投票:1回答:1

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
...

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

r igraph data-manipulation adjacency-matrix
1个回答
4
投票

这是使用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简化结果并减少暗淡。另一种方法是在lapply而不是data.frame上使用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
© www.soinside.com 2019 - 2024. All rights reserved.