首页 > 解决方案 > 有效地将长矩阵改组为由 R 中的列绑定子块(原始)组成的矩阵

问题描述

“我有一个很长的矩阵,测量 30^5 x 3 个条目。我基本上由 10.000 个 30 x 3 矩阵的子块组成,彼此堆叠。我想将它们彼此相邻地“绑定”(没有循环结构),导致 30 x 30^4 矩阵。

仅更改矩阵尺寸是行不通的,因为 R 会为每个单独的列填充新矩阵。

我确信有一种非常紧凑、超高效的方法可以做到这一点,一旦你向我提出明显的解决方案,我就会在额头上拍自己的耳光。

谢谢!”

“仅仅改变矩阵尺寸是行不通的,因为 R 会为每列填充新矩阵。”

```R
test <- matrix(c(1:18), 6, 3, byrow = FALSE)

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

dim(test) <- c(3,6)

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

我正在寻找的输出是: [,1] [,2] [,3] [,4] [,5] [,6] [1,] 1 7 13 4 10 16 [2,] 2 8 14 5 11 17 [3,] 3 9 15 6 12 18

标签: rmatrixdimension

解决方案


我们可以创建一个分组变量来拆分行序列,对矩阵进行子集化,然后cbind

do.call(cbind, lapply(split(seq_len(nrow(test)), 
       as.integer(gl(nrow(test), 3, nrow(test)))), function(i) test[i,]))
#      [,1] [,2] [,3] [,4] [,5] [,6]
#[1,]    1    7   13    4   10   16
#[2,]    2    8   14    5   11   17
#[3,]    3    9   15    6   12   18

推荐阅读