R 按行重塑矩阵

R 按行重塑矩阵,r,matrix,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

我有一个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))
但它也不起作用。有人能帮忙吗?

一个选项是

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

或者,这可以通过
数组

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
你可以做:

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

a这里有一个无循环的方法

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
m1
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