2013-04-19 2 views
18

행렬 목록 (모두 같은 수의 열)을 가지고 있다고 가정 해 봅시다. 행렬 ('행 바인드', 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 행렬에서 쉽게 할 수 있지만 행렬 목록을 사용하여이를 수행하는 방법을 잘 모르겠습니다.

답변

39

사용 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 

또한 또한 필요한 경우 NA으로 작성, 다른 열이 행렬을 결합 할 것 "plyr"패키지에서 rbind.fill.matrix() 기능에 관심이있을 수 있습니다.

> 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

왜'do.call (rbind, l)'이'rbind (l)'과 다른가? – clemlaflemme

+3

@clemlaflemme, rbind의 첫 번째 인수는'...'이며, 내부적으로 입력의'list '로 변환됩니다. 우리는 이미'list'를 가지고 있기 때문에'do.call'이 나오는 부분 인 각각을 다룰 필요가 있습니다. 'rbind'를 직접 사용하고 싶다면'rbind (l [[1]], l [[2]])'와 같이해야합니다. – A5C1D2H2I1M1N2O1R2T1

+0

@ A5C1D2H2I1M1N2O1R2T1, 행렬의 차원이 다른 경우 필자는 NAs를 필러로 추가하려고합니다. –

8

Antother 옵션 Reduce(...)을 사용하지만 data.frame하지 matrixdata.table 패키지에서 rbindlist를 사용하는 경우 나, 또 다른 옵션 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으로 변환한다 :

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 
관련 문제