按行重塑矩阵

时间:2019-06-25 07:16:29

标签: r matrix

我有一个尺寸为18000 x 54的矩阵。我想将其重塑为尺寸为54000 x 18的矩阵,其中我的初始矩阵的每一行都变成一个具有3行的矩阵。

让我们举个例子。我有一个矩阵如下:

a = matrix(1:18, nrow = 2, ncol = 9, byrow = T)
a
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
   1    2    3    4    5    6    7    8    9
  10   11   12   13   14   15   16   17   18

我想重塑此矩阵,使其变为:

[,1]  [,2]  [,3]    
  1      4    7  
  2      5    8
  3      6    9
  10    13   16
  11    14   17
  12    15   18 

我尝试了以下两种方法,但是它们不起作用。第一个如下:

dim(a) = c(6,3)

第二个是创建一个函数,然后将其应用于每一行:

reshapeX = function(x){
   dim(x) = c(3,as.integer(length(x)/3))
   return(as.matrix(x))
}
rbind(apply(a, 1, reshapeX))

但是它也不起作用。有人可以帮忙吗?

3 个答案:

答案 0 :(得分:5)

您可以这样做:

do.call(rbind, lapply(1:nrow(a), function(i) matrix(a[i, ], nrow=3)))

包含您的数据:

a <- matrix(1:18, nrow = 2, ncol = 9, byrow = TRUE)
do.call(rbind, lapply(1:nrow(a), function(i) matrix(a[i, ], nrow=3)))
#      [,1] [,2] [,3]
# [1,]    1    4    7
# [2,]    2    5    8
# [3,]    3    6    9
# [4,]   10   13   16
# [5,]   11   14   17
# [6,]   12   15   18

答案 1 :(得分:5)

这是一种无循环方法,

m1 <- matrix(c(a), ncol = 3, nrow = 6)
rbind(m1[c(TRUE, FALSE),], m1[c(FALSE, TRUE),])

#     [,1] [,2] [,3]
#[1,]    1    4    7
#[2,]    2    5    8
#[3,]    3    6    9
#[4,]   10   13   16
#[5,]   11   14   17
#[6,]   12   15   18

答案 2 :(得分:3)

一个选项是

out <- sapply(split.default(as.data.frame(a), as.integer(gl(ncol(a), 3, 
          ncol(a)))), function(x) c(t(x)))
colnames(out) <- NULL
out
#     [,1] [,2] [,3]
#[1,]    1    4    7
#[2,]    2    5    8
#[3,]    3    6    9
#[4,]   10   13   16
#[5,]   11   14   17
#[6,]   12   15   18

或以上述形式的简短形式

sapply(split(a,(col(a)-1) %/%3), function(x) c(matrix(x, nrow = 3, byrow = TRUE)))

或者可以使用array

更紧凑地完成此操作
apply(array(c(t(a)), c(3, 3, 2)), 2, c)
#      [,1] [,2] [,3]
#[1,]    1    4    7
#[2,]    2    5    8
#[3,]    3    6    9
#[4,]   10   13   16
#[5,]   11   14   17
#[6,]   12   15   18