#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