2013-04-19 4 views
18

Sagen wir, ich habe eine Liste von Matrizen (alle mit der gleichen Anzahl von Spalten). Wie würde ich diese Matrizen an eine Zeile anhängen/kombinieren ('row bind', rbind), um eine einzige Matrix zu erhalten?Kombinieren Sie eine Liste von Matrizen zu einer einzelnen Matrix nach Zeilen

Probe:

> matrix(1, nrow=2, ncol=3) 
    [,1] [,2] [,3] 
[1,] 1 1 1 
[2,] 1 1 1 
> matrix(2, nrow=3, ncol=3) 
    [,1] [,2] [,3] 
[1,] 2 2 2 
[2,] 2 2 2 
[3,] 2 2 2 
> m1 <- matrix(1, nrow=2, ncol=3) 
> m2 <- matrix(2, nrow=3, ncol=3) 

Jetzt können wir viele Matrizen in einer Liste haben, lassen Sie uns sagen, dass wir nur zwei haben:

l <- list(m1, m2) 

Ich möchte erreichen, so etwas wie:

> rbind(m1, m2) 
    [,1] [,2] [,3] 
[1,] 1 1 1 
[2,] 1 1 1 
[3,] 2 2 2 
[4,] 2 2 2 
[5,] 2 2 2 

Ich kann es leicht auf 2 Matrizen tun, aber ich bin mir nicht sicher, wie man es mit einer Liste von Matrizen macht.

Antwort

39

Verwenden do.call(rbind,...)

> m1 <- matrix(1, nrow=2, ncol=3) 
> m2 <- matrix(2, nrow=3, ncol=3) 
> l <- list(m1, m2) 
> do.call(rbind, l) 
    [,1] [,2] [,3] 
[1,] 1 1 1 
[2,] 1 1 1 
[3,] 2 2 2 
[4,] 2 2 2 
[5,] 2 2 2 

Sie auch in der rbind.fill.matrix() Funktion aus dem „plyr“ Paket interessiert sein, die auch Sie Matrizen lassen binden mit unterschiedlichen Spalten, mit NA in Füllung, wo nötig.

> m1 <- matrix(1, nrow=2, ncol=3) 
> m2 <- matrix(2, nrow=3, ncol=4) 
> l <- list(m1, m2) 
> library(plyr) 
> rbind.fill.matrix(l) 
    1 2 3 4 
[1,] 1 1 1 NA 
[2,] 1 1 1 NA 
[3,] 2 2 2 2 
[4,] 2 2 2 2 
[5,] 2 2 2 2 
+0

Warum 'do.call (rbind, l)' ist anders als 'rbind (l)'? – clemlaflemme

+3

@clemlaflemme, das erste "Argument" zu 'rbind' ist' ... ', das intern in eine' Liste' der Eingaben umgewandelt wird. Da wir bereits eine 'liste' haben, müssen wir jede einzeln behandeln, wo die' do.call' ins Spiel kommt. Wenn Sie 'rbind' direkt verwenden möchten, müssen Sie stattdessen etwas wie' rbind (l [[1]], l [[2]]) '' tun. – A5C1D2H2I1M1N2O1R2T1

+0

@ A5C1D2H2I1M1N2O1R2T1, was ist, wenn die Matrizen unterschiedliche Dimensionen haben und wir NAs als Füllstoffe hinzufügen wollen? –

8

Antother Option Reduce(...), aber ich denke, weniger effizient als do.call

m1 <- matrix(1, nrow=2, ncol=3) 
m2 <- matrix(2, nrow=3, ncol=3) 
l <- list(m1, m2) 
Reduce(rbind, l) 
    [,1] [,2] [,3] 
[1,] 1 1 1 
[2,] 1 1 1 
[3,] 2 2 2 
[4,] 2 2 2 
[5,] 2 2 2 

eine weitere Option, wenn Sie data.frame und nicht matrix ist rbindlist von data.table Paket zu verwenden. Hier wandle ich vor dem Aufruf in dat.frame um:

rbindlist(lapply(l,as.data.frame)) 
    V1 V2 V3 
1: 1 1 1 
2: 1 1 1 
3: 2 2 2 
4: 2 2 2 
5: 2 2 2 
Verwandte Themen