Измените массив 2x6 на 3x2x2, построчно - PullRequest
0 голосов
/ 27 мая 2018

У меня есть следующий массив:

set.seed(10)
data <- array(rexp(12), dim=c(2,6))

         [,1]      [,2]      [,3]       [,4]      [,5]      [,6]
[1,] 1.398107 0.1704216 0.1664439 0.01057119 2.3546118 0.5222435
[2,] 1.110459 1.9187813 0.9702900 2.79300971 0.6672384 0.1467129

И я хочу изменить его, чтобы получить массив с размерами [3,2,2], но делать это по строкам следующим образом:

, , 1

          [,1]      [,2]
[1,] 1.398107  0.1704216
[2,] 0.1664439 0.01057119
[3,] 2.3546118 05222435

, , 2

           [,1]      [,2]
[1,] 1.110459   1.9187813
[2,] 0.9702900  2.79300971
[3,] 0.6672386  0.1467129

Я пытался array(data, dim=c(3,2,2)), но у меня все получилось не так, идеи?

Ответы [ 2 ]

0 голосов
/ 27 мая 2018

Возможно, это будет гораздо более быстрое и простое базовое решение:

 array( aperm(data, c(2,1) ), c(3,2,2) )

Я получу другой массив для этого случайного начального числа:

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

Функция aperm может поменятьсястроки для столбцов:

> aperm(data, c(2,1))
           [,1]      [,2]
[1,] 0.01495641 0.9202212
[2,] 0.75215894 1.5750419
[3,] 0.23165862 1.0866730
[4,] 2.32762287 0.7291238
[5,] 1.28831010 0.6722683
[6,] 0.42652979 1.1154219

И array затем можно переставить в нужную структуру:

>  array( aperm(data, c(2,1)), c(3,2,2))
, , 1

           [,1]      [,2]
[1,] 0.01495641 2.3276229
[2,] 0.75215894 1.2883101
[3,] 0.23165862 0.4265298

, , 2

          [,1]      [,2]
[1,] 0.9202212 0.7291238
[2,] 1.5750419 0.6722683
[3,] 1.0866730 1.1154219
0 голосов
/ 27 мая 2018

РЕДАКТИРОВАТЬ: лучший метод 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))
...