Search code examples
rigraphdata-manipulationadjacency-matrix

producing a full adjacency matrix from partial information


I have a matrix that contains all the info necessary to construct 5x5 adjacency matrices. Each row represents one matrix:

     [,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 to create an adjacency matrix from the nth row of data. For the first row of have, the want matrix would look like this:

     [,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

How do I get from have to want?


Solution

  • Here is an option using lower.tri and upper.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
    

    The unlist(..., recursive = F) part seems somewhat awkward but is necessary to prevent apply from simplifying the result and dropping dims. An alternative would be to use lapply on a data.frame instead of a 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)
    })
    

    giving the same result.


    Sample data

    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