TheRimalaya
TheRimalaya

Reputation: 4592

Combine a matrix and its transpose to get a square symmetric matrix

A matrix of a form such as,

structure(c("W1", NA, NA, NA, NA, "W1", NA, NA, NA, NA, NA, "W2", 
NA, NA, "W2", NA, "W2", NA, NA, "W2", NA, NA, "W3", "W3", NA, 
NA, "W2", NA, NA, "W2", NA, NA, "W3", "W3", NA, NA, NA, "W3", 
"W3", NA, NA, NA, NA, NA, NA, "W1", NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, "W2", NA, NA, "W2", "W1", NA, 
NA, NA, NA, "W1", NA, NA, NA, NA), .Dim = c(5L, 15L))

genmat



    [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] [,15]
[1,] "W1" "W1" NA   NA   NA   NA   NA   NA   NA   "W1"  NA    NA    NA    "W1"  "W1" 
[2,] NA   NA   "W2" "W2" NA   "W2" NA   NA   NA   NA    NA    NA    "W2"  NA    NA   
[3,] NA   NA   NA   NA   "W3" NA   "W3" "W3" NA   NA    NA    NA    NA    NA    NA   
[4,] NA   NA   NA   NA   "W3" NA   "W3" "W3" NA   NA    NA    NA    NA    NA    NA   
[5,] NA   NA   "W2" "W2" NA   "W2" NA   NA   NA   NA    NA    NA    "W2"  NA    NA   

I want to combine this matrix and its transpose to get a square matrix of a form,

      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] [,15]
 [1,] "W1" "W1" NA   NA   NA   NA   NA   NA   NA   "W1"  NA    NA    NA    "W1"  "W1" 
 [2,] "W1" "W1" NA   NA   NA   NA   NA   NA   NA   "W1"  NA    NA    NA    "W1"  "W1" 
 [3,] NA   NA   "W2" "W2" NA   "W2" NA   NA   NA   NA    NA    NA    "W2"  NA    NA   
 [4,] NA   NA   "W2" "W2" NA   "W2" NA   NA   NA   NA    NA    NA    "W2"  NA    NA   
 [5,] NA   NA   NA   NA   "W3" NA   "W3" "W3" NA   NA    NA    NA    NA    NA    NA   
 [6,] NA   NA   "W2" "W2" NA   "W2" NA   NA   NA   NA    NA    NA    "W2"  NA    NA   
 [7,] NA   NA   NA   NA   "W3" NA   "W3" "W3" NA   NA    NA    NA    NA    NA    NA   
 [8,] NA   NA   NA   NA   "W3" NA   "W3" "W3" NA   NA    NA    NA    NA    NA    NA   
 [9,] NA   NA   NA   NA   NA   NA   NA   NA   NA   NA    NA    NA    NA    NA    NA   
[10,] "W1" "W1" NA   NA   NA   NA   NA   NA   NA   "W1"  NA    NA    NA    "W1"  "W1" 
[11,] NA   NA   NA   NA   NA   NA   NA   NA   NA   NA    NA    NA    NA    NA    NA   
[12,] NA   NA   NA   NA   NA   NA   NA   NA   NA   NA    NA    NA    NA    NA    NA   
[13,] NA   NA   "W2" "W2" NA   "W2" NA   NA   NA   NA    NA    NA    "W2"  NA    NA   
[14,] "W1" "W1" NA   NA   NA   NA   NA   NA   NA   "W1"  NA    NA    NA    "W1"  "W1" 
[15,] "W1" "W1" NA   NA   NA   NA   NA   NA   NA   "W1"  NA    NA    NA    "W1"  "W1" 

This matrix is takes its elements from itersection of genmat and its transpose. i.e. the elements of output matrix at 1, 2, 10, 14 and 15 columns are same as corresponding columns of genmat and corresponding rows of transpose of genmat.

Upvotes: 0

Views: 155

Answers (1)

Aurèle
Aurèle

Reputation: 12819

I'm really not sure I understood the question, but this seems to give the expected output:

genmat[apply(genmat, 2, function(col) match(TRUE, !is.na(col))), ]

What it does: for the i-th line of the result, use the k-th line of genmat where k is the index of the first non NA value of the i-th column of genmat.

In very explicit plain for-loops, that would look like:

res <- matrix(NA_character_, nrow = NCOL(genmat), ncol = NCOL(genmat))

for (i in seq_len(NROW(res))) {
  first_non_NA <- which(!is.na(genmat[, i]))[1]
  res[i, ] <- genmat[first_non_NA, ]
}

Note: this does not guarantee the symmetry of res. The symmetry comes from some non-explicit characteristic of your example data.

Upvotes: 2

Related Questions