2014-10-02 149 views
6

我想将上三角形复制到存储在列表中的一堆矩阵的下三角形中。将上三角形复制到列表中几个矩阵的下三角形

只有充满了数据上的三角形创建矩阵列表:

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 

上面的三角复制到矩阵的下三角,您可以使用:

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

然而,我想将上三角形复制到列表中每个矩阵的较低位置“L”

回答

13

这样的任务的典型策略是首先处理一个函数,你想要一个单一的列表元素(这里是一个单一的上三角矩阵),然后使用lapply()将它依次应用于每个列表元素。

在这种情况下,这里就是我想要的使用:

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 
+1

......并下三角复制到上三角:M [upper.tri(M)< - T(M)[ upper.tri(米)] – 2014-12-17 17:53:53