Преобразуйте N 2-мерные матрицы (T * M) в трехмерный тензор (T * N * M) с помощью tidyverse / R - PullRequest
0 голосов
/ 14 апреля 2019

Для каждой из моих N переменных у меня есть (T * M) матрица признаков, то есть M наблюдений на t \ in T. Проблема состоит в том, как преобразовать это в (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

И мне нужно создать трехмерный массив (количество строк), такой, чтобы первый элемент был

     [,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, так что оцените расширяемые реализации!

1 Ответ

1 голос
/ 14 апреля 2019

Вот вариант 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 в его функциональной форме , т.е.

`dim<-`(...)

Что позволяет нам делать все в одной строке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...