РЕДАКТИРОВАТЬ: лучший метод aperm(array(data, c(2, 2, 3)))
.Спасибо @smci за ссылку.
Оригинальное решение:
Я получаю разные данные с этим начальным числом, но вы можете использовать matrix
и lapply
, чтобы сделать каждую строку матрицей из двух столбцов.затем abind
для связывания в один массив.
set.seed(10)
data <- array(rexp(12), dim=c(2,6))
data
#
# [,1] [,2] [,3] [,4] [,5] [,6]
# [1,] 0.01495641 0.7521589 0.2316586 2.3276229 1.2883101 0.4265298
# [2,] 0.92022120 1.5750419 1.0866730 0.7291238 0.6722683 1.1154219
library(abind)
abind(lapply(split(data, row(data)), matrix, ncol = 2, byrow = T)
, along = 3)
# , , 1
#
# [,1] [,2]
# [1,] 0.01495641 0.7521589
# [2,] 0.23165862 2.3276229
# [3,] 1.28831010 0.4265298
#
# , , 2
#
# [,1] [,2]
# [1,] 0.9202212 1.5750419
# [2,] 1.0866730 0.7291238
# [3,] 0.6722683 1.1154219
С трубами
library(magrittr)
data %>%
split(row(.)) %>%
lapply(matrix, ncol = 2, byrow = T) %>%
abind(along = 3)
Вот вариант, который намного быстрее и не требует пакетов.Я не думаю, что это очень ясно, хотя.Не уверен, как написать это более четко.
array(unlist(data)[order(rep(c(1, 3, 2, 4), 3))], dim = c(3, 2, 2))
Может быть, это?
array(unlist(data) %>% .[order(!seq_along(.) %% 2
, !seq_along(.) %% 4)]
, dim = c(3, 2, 2))