Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
476 views
in Technique[技术] by (71.8m points)

r - Copy upper triangle to lower triangle for several matrices in a 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 upper triangle to the lower for each of matrix in the list "L"

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

A typical strategy for tasks like this is to first work up a function that does what you'd like to a single list element (here a single upper-triangular matrix), and then use lapply() to apply it in turn to each of the list elements.

In this case, here's what I'd 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

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...