Присоединить матрицы из списка к одной матрице в R

17

Предположим, у меня есть список матриц (все с одинаковым количеством столбцов). Как бы добавить (rbind) эти матрицы для получения одной матрицы?

Пример:

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

Теперь мы можем иметь много матриц в списке, допустим, у нас есть только два:

l <- list(m1, m2)

Я хотел бы добиться чего-то вроде:

> 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

Я могу легко сделать это на 2-х матрицах, но я не уверен, как это сделать со списком матриц.

    
задан datageek 19.04.2013 в 19:45
источник

2 ответа

35

Использовать 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

Вы также можете быть заинтересованы в функции rbind.fill.matrix() из пакета plyr, которая также позволит вам связывать матрицы с разными столбцами, заполняя NA , если необходимо.

> 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
    
ответ дан A5C1D2H2I1M1N2O1R2T1 19.04.2013 в 19:46
источник
  • почему do.call (rbind, l) отличается от rbind (l)? –  clemlaflemme 20.10.2015 в 11:03
  • @clemlaflemme, первый «аргумент» для rbind - это ..., который внутренне преобразуется в список входов. Поскольку у нас уже есть список, мы должны рассматривать каждый отдельно, в котором происходит do.call. Если вы хотите использовать rbind напрямую, вам нужно будет сделать что-то вроде rbind (l [[1]], l [[2]]). –  A5C1D2H2I1M1N2O1R2T1 20.10.2015 в 11:13
  • @ A5C1D2H2I1M1N2O1R2T1, что, если матрицы имеют разные размеры, и мы хотим добавить NA в качестве наполнителей? –  phil_t 15.12.2017 в 23:01
  • @phil_t, я полагаю, вы полностью не прочитали ответ. См. предложение plyr. –  A5C1D2H2I1M1N2O1R2T1 16.12.2017 в 03:11
6

Опция Antother, использующая Reduce(...) , но я считаю менее эффективной, чем 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

Другой вариант, если у вас есть data.frame , а не matrix , заключается в использовании rbindlist из пакета data.table . Здесь я конвертирую в data.frame перед вызовом:

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
    
ответ дан agstudy 19.04.2013 в 19:48
источник