使用tidyverse / R将N 2-d矩阵(T * M)重新形成为(T * N * M)的三维张量

问题描述 投票:0回答:1

对于我的N个变量中的每一个,我都有一个(T * M)特征矩阵,即每T中的M个观测值。问题是如何将其转换为(T * N * M)数组。例如,在以下示例中,N = 2,T = 3,M = 4:

x1 <- matrix(1:24, 3,4)
> x1
     [,1] [,2] [,3] [,4]
[1,]    1    4    7   10
[2,]    2    5    8   11
[3,]    3    6    9   12


x2 <- matrix(25:48, 3,4)
x2
     [,1] [,2] [,3] [,4]
[1,]   25   28   31   34
[2,]   26   29   32   35
[3,]   27   30   33   36

我需要制作一个3维(行数)数组,这样第一个元素就是

     [,1] [,2] [,3] [,4]
[1,]    1    4    7   10
[2,]   25   28   31   34

第二个是:

    [,1] [,2] [,3] [,4]
[1,]    2    5    8   11
[2,]   26   29   32   35

第三个:

[,1] [,2] [,3] [,4]
[1,]    3    6    9   12
[2,]   27   30   33   36

等等等等。对于以下示例,输出的尺寸应为(3,2,4)。

我需要为相对较大的N和T做这个,所以欣赏可扩展的实现!

arrays r matrix reshape2
1个回答
1
投票

这是一个base R选项。

out <- `dim<-`(rbind(c(t(x1)), c(t(x2))), c(2, 4, 3))
out
#, , 1
#
#     [,1] [,2] [,3] [,4]
#[1,]    1    4    7   10
#[2,]   25   28   31   34
#
#, , 2
#
#     [,1] [,2] [,3] [,4]
#[1,]    2    5    8   11
#[2,]   26   29   32   35
#
#, , 3
#
#     [,1] [,2] [,3] [,4]
#[1,]    3    6    9   12
#[2,]   27   30   33   36

当我们调用x <- rbind(c(t(x1)), c(t(x2)))时,我们得到以下矩阵

x
#     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12]
#[1,]    1    4    7   10    2    5    8   11    3     6     9    12
#[2,]   25   28   31   34   26   29   32   35   27    30    33    36

我们需要改变我们可以做的对象的尺寸

dim(x) <- c(2, 4, 3)

获得相同结果的另一种方法是在dim中调用functional form的替换方法,即

`dim<-`(...)

这使我们能够在一条线上完成所有工作。

© www.soinside.com 2019 - 2024. All rights reserved.