Copy the upper triangle to the lower triangle for several matrices in the list

I want to copy the upper triangle to the lower triangle of a bunch of matrices stored in a list.

Create a list of matrices with only the upper triangle filled with data:

m1<-matrix(1:9, 3, 3);lower.tri(m1);m1[lower.tri(m1)]<- NA; m1 m2<-matrix(9:18, 3, 3);lower.tri(m2);m2[lower.tri(m2)]<- NA; m2 m3<-matrix(18:27, 3, 3);lower.tri(m3);m3[lower.tri(m3)]<- NA; m3 m4<-matrix(27:36, 3, 3);lower.tri(m4);m4[lower.tri(m4)]<- NA; m4 L<-list(m1,m2, m3, m4); L 

To copy the upper triangle to the lower triangle of the matrix, you can use:

 M <- m1 for(i in 1:nrow(M)) {for(j in 1:i) {M[i,j]=M[j,i] }} M 

However, I want to copy the top triangle to the bottom for each of the matrices in the list β€œL”

+7
list matrix r
source share
1 answer

A typical strategy for such tasks is to first create a function that does what you want with one element of the list (there is one upper triangular matrix here), and then use lapply() to apply it in turn for each of the elements list.

In this case, here is what I would use:

 f <- function(m) { m[lower.tri(m)] <- t(m)[lower.tri(m)] m } ## Check that it works on a single list element f(L[[1]]) # [,1] [,2] [,3] # [1,] 1 4 7 # [2,] 4 5 8 # [3,] 7 8 9 ## Use lapply() to apply it to each list element lapply(L, f) # [[1]] # [,1] [,2] [,3] # [1,] 1 4 7 # [2,] 4 5 8 # [3,] 7 8 9 # # [[2]] # [,1] [,2] [,3] # [1,] 9 12 15 # [2,] 12 13 16 # [3,] 15 16 17 # # [[3]] # [,1] [,2] [,3] # [1,] 18 21 24 # [2,] 21 22 25 # [3,] 24 25 26 # # [[4]] # [,1] [,2] [,3] # [1,] 27 30 33 # [2,] 30 31 34 # [3,] 33 34 35 
+14
source share

All Articles