2013-04-19 11 views
18

Załóżmy, że mam listę macierzy (wszystkie z taką samą liczbą kolumn). Jak mogę dołączyć/połączyć te macierze za pomocą wiersza ("powiązanie wiersza", rbind), aby uzyskać pojedynczą macierz?Połączyć listę macierzy z pojedynczą macierzą według wierszy

Próbka:

> 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) 

Teraz możemy mieć wiele matryc w postaci listy, powiedzmy, mamy tylko dwa:

l <- list(m1, m2) 

chciałbym osiągnąć coś takiego:

> 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 

Mogę łatwo zrobić to na 2 matrycach, ale nie jestem pewien, jak to zrobić z listą macierzy.

Odpowiedz

39

Zastosowanie 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 

Możesz być także zainteresowany funkcją rbind.fill.matrix() z pakietu „plyr”, która pozwala także wiążą się matryce o różnych kolumn, wypełnienie z NA gdzie to konieczne.

> 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

dlaczego 'do.call (rbind, l)' różni się od 'rbind (l)'? – clemlaflemme

+3

@ clemlaflemme, pierwszym "argumentem" do 'rbind' jest' ... ', które wewnętrznie jest konwertowane na' listę' wejść. Ponieważ mamy już "listę", musimy traktować każdą z nich osobno, czyli tam, gdzie wchodzi 'do.call'. Jeśli chciałbyś użyć 'rbind' bezpośrednio, musiałbyś zrobić coś takiego jak' rbind (l [[1]], l [[2]]) 'zamiast tego. – A5C1D2H2I1M1N2O1R2T1

+0

@ A5C1D2H2I1M1N2O1R2T1, co jeśli macierze mają różne wymiary, a my chcemy dodać NA jako wypełniacze? –

8

opcja Antother użyciu Reduce(...), ale myślę, że mniej wydajny niż 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 

inną opcją, jeśli masz data.frame i nie matrix, jest użycie rbindlist z data.table opakowaniu. Tutaj konwertuję do data.frame przed wywołaniem go:

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 
Powiązane problemy