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