r - 对矩形矩阵 r 中的方 block 进行转置

标签 r matrix dataframe

假设我有两个绑定(bind)在一起的方阵(实际上更多):

mat = matrix(1:18,nrow=3,ncol=6)

mat
     [,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

我想对每个(3x3)矩阵进行转置并将它们并排粘在一起,所以结果是:
mat2
     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]    1    2    3   10   11   12
[2,]    4    5    6   13   14   15
[3,]    7    8    9   16   17   18

我不想手动执行此操作,因为它是许多矩阵 c 绑定(bind)在一起,而不仅仅是 2。

我想要一个避免循环或应用的解决方案(这只是循环的包装器)。我需要有效的解决方案,因为这必须运行数万次。

最佳答案

一种方法是使用矩阵索引

matrix(t(m), nrow=nrow(m))[, c(matrix(1:ncol(m), nrow(m), byrow=T)) ]

这采用转置矩阵并按所需顺序重新排列列。
m <- matrix(1:18,nrow=3,ncol=6)
matrix(t(m), nrow=nrow(m))
#      [,1] [,2] [,3] [,4] [,5] [,6]
# [1,]    1   10    2   11    3   12
# [2,]    4   13    5   14    6   15
# [3,]    7   16    8   17    9   18

因此,我们希望将第 1、第 3 和第 5 列以及第 2、第 4 和第 6 列放在一起。
一种方法是用
c(matrix(1:ncol(m), nrow(m), byrow=T))
#[1] 1 3 5 2 4 6

作为替代方案,您可以使用
idx <- rep(1:ncol(m), each=nrow(m), length=ncol(m)) ;
do.call(cbind, split.data.frame(t(m), idx))

尝试新矩阵
(m <- matrix(1:50, nrow=5))
#      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
# [1,]    1    6   11   16   21   26   31   36   41    46
# [2,]    2    7   12   17   22   27   32   37   42    47
# [3,]    3    8   13   18   23   28   33   38   43    48
# [4,]    4    9   14   19   24   29   34   39   44    49
# [5,]    5   10   15   20   25   30   35   40   45    50

matrix(t(m), nrow=nrow(m))[, c(matrix(1:ncol(m), nrow(m), byrow=T)) ]
#      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
# [1,]    1    2    3    4    5   26   27   28   29    30
# [2,]    6    7    8    9   10   31   32   33   34    35
# [3,]   11   12   13   14   15   36   37   38   39    40
# [4,]   16   17   18   19   20   41   42   43   44    45
# [5,]   21   22   23   24   25   46   47   48   49    50

关于r - 对矩形矩阵 r 中的方 block 进行转置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37533057/

相关文章:

r - 注释树状图节点上的距离

R:更改 heatmap.2 rowname 列的大小

c - OpenCL - C - 矩阵镜像

matrix - CUDA 添加矩阵的行

r - 根据相同数据框的逻辑获取列名向量

python - 在Python中使用曼哈顿距离创建新的数据框

R用findOverlaps()重叠多个GRanges

r - 变量数量不断变化的 glm 模型循环

Python:水平切片矩阵

python-3.x - 根据 Python 中另一个数据帧的列对一个数据帧的行(具有重复项的列)进行排序