Let\'s make a replicable example:
This is my initial matrix
d<- matrix(1:80,,5)
d
[,1] [,2] [,3] [,4] [,5]
[1,] 1 17 33 49 65
[2,
We can try
d1 <- array(d, c(4, 4, 5))
do.call(rbind, lapply(seq(dim(d1)[3]), function(i) d1[,,i]))
# [,1] [,2] [,3] [,4]
# [1,] 1 5 9 13
# [2,] 2 6 10 14
# [3,] 3 7 11 15
# [4,] 4 8 12 16
# [5,] 17 21 25 29
# [6,] 18 22 26 30
# [7,] 19 23 27 31
# [8,] 20 24 28 32
# [9,] 33 37 41 45
#[10,] 34 38 42 46
#[11,] 35 39 43 47
#[12,] 36 40 44 48
#[13,] 49 53 57 61
#[14,] 50 54 58 62
#[15,] 51 55 59 63
#[16,] 52 56 60 64
#[17,] 65 69 73 77
#[18,] 66 70 74 78
#[19,] 67 71 75 79
#[20,] 68 72 76 80
Using matrix indexing
# number of new columns
cols <- 4
matrix(t(d), ncol=cols)[matrix(1:(length(d)/cols), ncol=ncol(d), byrow=TRUE), ]
# This almost gets us there but rows are not in correct order
matrix(t(d), ncol=cols)
# [,1] [,2] [,3] [,4]
# [1,] 1 5 9 13
# [2,] 17 21 25 29
# [3,] 33 37 41 45
# [4,] 49 53 57 61
# [5,] 65 69 73 77
# [6,] 2 6 10 14
# [7,] 18 22 26 30
# [8,] 34 38 42 46
# use this t index / group the relevant rows
c(matrix(1:(length(d)/cols), ncol=ncol(d), byrow=TRUE))
# [1] 1 6 11 16 2 7 12 17 3 8 13 18 4 9 14 19 5 10 15 20
Yet another approach:
n = 4
matrix(aperm(array(d, c(n, nrow(d)/n, ncol(d))), c(1, 3, 2)), ncol = nrow(d)/n)
Another simple solution:
matrix <- matrix(seq(1,16), ncol = 4)
rbind(matrix,
16+matrix,
32+matrix,
48+matrix,
64+matrix)
or:
matrix <- matrix(seq(1,16), ncol = 4)
do.call(rbind, lapply(0:4, function(x){
16*x+matrix
})
)
We can do this directly
do.call(rbind,lapply(1:ncol(d),function(t) matrix(d[,t],ncol = 4)))