How can I concatenate matrices of same columns but different number of rows? For example, I want to concatenate a (dim(a) = 15 7000) and b (dim(b) = 16 7000) and I want the result to be a matrix of 31 rows by 7000 columns.
Can I also do this for matrices with a different number of rows and columns? Say I want to combine a matrix of 15 rows and 7000 columns with another of 16 rows and 7500 columns. Can I create one dataset with that?
4 Answers
Sounds like you're looking for rbind:
> a<-matrix(nrow=10,ncol=5) > b<-matrix(nrow=20,ncol=5) > dim(rbind(a,b)) [1] 30 5 Similarly, cbind stacks the matrices horizontally.
I am not entirely sure what you mean by the last question ("Can I do this for matrices of different rows and columns.?")
3cbindX from the package gdata combines multiple columns of differing column and row lengths. Check out the page here:
It takes multiple comma separated matrices and data.frames as input :) You just need to
install.packages("gdata", dependencies=TRUE)
and then
library(gdata) concat_data <- cbindX(df1, df2, df3) # or cbindX(matrix1, matrix2, matrix3, matrix4) 3Others have addressed the matter of concatenating two matrices:
- horizontally with
cbind(the "c" stands for "column", so you are binding the columns of the two matrices); or - vertically with
rbind(the "r" stands for "row", so you are binding the rows of the two matrices).
What others haven't pointed out explicitly is that:
- because
cbindbinds columns, the two matrices have to have the same number of rows:cbindbuilds a matrix that is wider, but it needs the "height" (# of rows) of the two matrices to match; and - because
rbindbinds rows, the two matrices have to have the same number of columns:rbindbuilds a matrix that is taller, but it needs the "width" (# of columns) of the two matrices to match.
Take a look at this:
> A <- matrix(nrow = 3, ncol = 4) > B <- matrix(nrow = 3, ncol = 5) > C <- matrix(nrow = 4, ncol = 5) > D <- cbind(A, B) # Works because A and B have same # of rows > cbind(A, C) # Fails Error in cbind(A, C) : number of rows of matrices must match (see arg 2) > E <- rbind(B, C) # Works because B and C have same # of columns > rbind(A, C) # Fails Error in rbind(A, C) : number of columns of matrices must match (see arg 2) So, no, you cannot put together two matrices if they have a different number of rows and a different number of columns. You would need to do something to either one of the matrices first, to make sure that their shapes become compatible for concatenation.
From the dplyr documentation we have bind_cols and bind_rows:
bind_cols Efficiently bind multiple data frames by row and column bind_rows Efficiently bind multiple data frames by row and column So using dplyr:
A = matrix(1:9, ncol = 3) B = matrix(1:9, ncol = 3) A %>% as_tibble(A,B) %>% bind_rows(as_tibble(B)) V1 V2 V3 <int> <int> <int> 1 1 4 7 2 2 5 8 3 3 6 9 4 1 4 7 5 2 5 8 6 3 6 9 A %>% as_tibble() %>% bind_cols(as_tibble(B)) V1...1 V2...2 V3...3 V1...4 V2...5 V3...6 <int> <int> <int> <int> <int> <int> 1 1 4 7 1 4 7 2 2 5 8 2 5 8 3 3 6 9 3 6 9 If you want return as a matrix just %>% as.matrix()