2016-03-31 3 views
0

ich folgendes Problem habe, kann sagen, ich habe eine Funktion ss(), die Daten erzeugt, die immer vier Spalten haben aber unterschiedliche Anzahl von Zeilen, mag ich in ein Array diese Ausgabe speichernMatrizen mit unterschiedlichen Abmessungen in R Eingabe

ss(M[1]) #matrix with 4 cols and 10 rows 
ss(M[2]) #matrix with 4 cols and 20 rows 
ss(M[3]) #matrix with 4 cols and 40 rows 

Dann möchte ich diese zusammen in einem Array setzen:

J<-array(40,4,3) 
for (i in 1:3){ 
J[,,i]<-ss(M[i]) 
} 

Aber was passiert, ist, dass für die erste Matrix mit 10 Zeilen die Werte wiederholt werden, um das Array zu füllen, ich 0s nach dem haben will Daten, die in M ​​existieren, sind gefüllt. Ich habe dann versucht:

J<-array(40,4,3) 
for (i in 1:3){ 
dims<-dim(ss(M[i])) 
J[1:dims[1],1:dims[2],i]<-ss(M[i]) 
} 

Aber ich fühle, dass diese Methode nicht so effizient ist, gibt es einen besseren Weg? Gibt es irgendeine Art und Weise anwenden zu verwenden:

B<-lapply(M, ss) 

aber das ist auch extrem langsam, (M hat 10000 Elemente)

Antwort

1

Eine Möglichkeit, Ihr Objekt B ohne eine Schleife zu schaffen wäre:

B <- as.array(lapply(1:3, ss)) 

Wenn Sie wirklich alle Matrizen zwingen wollen, 40 Zeilen zu haben und die Nicht-Datenelemente mit Nullen füllen, können Sie eine Version von ss() erstellen, die eine Matrix mit dieser Anzahl von Zeilen zurückgibt. Wie in:

ss <- function(x) { 
    m <- matrix(x, nrow = x*10, ncol = 4) 
    rbind(m, matrix(0, nrow = 40 - nrow(m), ncol = 4)) 
} 
Verwandte Themen