Выравнивание 3-мерных данных до удлиненных 2-D в R

#r #multidimensional-array

#r #многомерный массив

Вопрос:

У меня есть данные с dim 10,5,2 (t, x, y), и я хочу преобразовать их в размеры 10 * 5,3. т.е. Добавить каждый кадр t к кадру (x, y) со значением t.

например:

 data[1,,]=
x y
1 2
1 3

data[2,,]=
x y
5 2
1 6
 

Я хотел бы преобразовать эти данные в сплющенный массив следующим образом

 x y t
1 2 1
1 3 1
5 2 2
1 6 2
 

Я искал, есть ли уже функция R для этого, или я бы сделал это, зациклив каждый t-массив и добавив воссозданный массив внизу основного массива.

Ответ №1:

 a <- array(1:8, c(2,2,2))
a[1,,]
#     [,1] [,2]
#[1,]    1    5
#[2,]    3    7

a[2,,]
#     [,1] [,2]
#[1,]    2    6
#[2,]    4    8

m <- matrix(aperm(a, c( 2, 1, 3)), nrow=prod(dim(a)[2:3]))
cbind(m, rep(seq_len(dim(a)[2]), each=dim(a)[1]))
#     [,1] [,2] [,3]
#[1,]    1    5    1
#[2,]    3    7    1
#[3,]    2    6    2
#[4,]    4    8    2
 

Комментарии:

1. именно то, что я хотел!

2. @AnkurGupta: первую строку можно упростить до m <- apply(a, 3, c) , что красивее, но медленнее для больших матриц.

Ответ №2:

Вот другой подход:

 a <- array(c(1,5,1,1,2,2,3,6), dim = c(2,2,2) )
do.call('rbind',lapply(1:dim(a)[3], function(x) cbind(a[x,,], t = x)))
         t
[1,] 1 2 1
[2,] 1 3 1
[3,] 5 2 2
[4,] 1 6 2
 

Ответ №3:

Также:

If a — массив.

 ft <- ftable(a)
cbind(ft[,1:2], as.numeric(factor(gsub("\_.*","",row.names(as.matrix(ft))))))
     [,1] [,2] [,3]
[1,]    1    2    1
[2,]    1    3    1
[3,]    5    2    2
[4,]    1    6    2