【问题标题】:Efficiently reshuffling a long matrix into one consisting of column bound subblocks (of the original) in R有效地将长矩阵改组为由 R 中的列绑定子块(原始)组成的矩阵
【发布时间】:2019-06-26 18:28:04
【问题描述】:

“我有一个很长的矩阵,测量 30^5 x 3 个条目。我基本上由 10.000 个 30 x 3 矩阵的子块组成,彼此堆叠。我想将它们“cbind”,紧挨着一个另一个(没有循环结构),导致一个 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

【问题讨论】:

    标签: r matrix dimension


    【解决方案1】:

    我们可以创建一个分组变量来分割行序列,对矩阵进行子集化,然后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
    

    【讨论】:

    • 太棒了。这个高度浓缩的代码已经解决了我的问题。非常有效率。再次感谢!!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-03
    • 2018-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多