2014-10-02 3 views
6

Ich möchte das obere Dreieck in das untere Dreieck einer Reihe von Matrizen kopieren, die in einer Liste gespeichert sind.Kopiere oberes Dreieck in unteres Dreieck für mehrere Matrizen in einer Liste

Erstellen Sie eine Liste von Matrizen mit nur dem oberen Dreieck mit Daten gefüllt:

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 

das obere Dreieck auf die untere Dreieck der Matrix Sie verwenden können, kopieren:

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

jedoch Ich möchte das obere Dreieck nach unten für jede Matrix in der Liste "L" kopieren.

Antwort

13

Eine typische Strategie für solche Aufgaben ist es, zuerst eine Funktion zu entwickeln, die was tut Sie möchten ein einzelnes Listenelement (hier eine einzelne obere Dreiecksmatrix) verwenden und dann lapply() verwenden, um es nacheinander auf jedes der Listenelemente anzuwenden.

In diesem Fall hier ist, was ich verwenden würde:

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

... und das untere Dreieck oberes Dreieck zu kopieren: m [upper.tri (m)] <- t (m) [ obere.tri (m)] –