Подтвердить что ты не робот

Объединить список матриц с одной матрицей по строкам

Скажем, у меня есть список матриц (все с одинаковым количеством столбцов). Как бы добавить/объединить эти матрицы по строке ('row bind', 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-х матрицах, но я не уверен, как это сделать со списком матриц.

4b9b3361

Ответ 1

Используйте 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

Ответ 2

Вариант 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