Как преобразовать матрицу в массив? - PullRequest
1 голос
/ 05 марта 2012

У меня большой набор данных, и я хочу преобразовать его в массив. Но, например, давайте иметь простой пример. У меня есть следующая матрица

`\begin{table}[ht]
\begin{center}
\begin{tabular}{rrrrrrr}
\hline
& 1 & 2 & 3 & 4 & 5 & 6 \\ 
\hline
1 &   1 &  11 &  21 &  31 &  41 &  51 \\ 
2 &   2 &  12 &  22 &  32 &  42 &  52 \\ 
3 &   3 &  13 &  23 &  33 &  43 &  53 \\ 
4 &   4 &  14 &  24 &  34 &  44 &  54 \\ 
5 &   5 &  15 &  25 &  35 &  45 &  55 \\ 
6 &   6 &  16 &  26 &  36 &  46 &  56 \\ 
7 &   7 &  17 &  27 &  37 &  47 &  57 \\ 
8 &   8 &  18 &  28 &  38 &  48 &  58 \\ 
9 &   9 &  19 &  29 &  39 &  49 &  59 \\ 
10 &  10 &  20 &  30 &  40 &  50 &  60 \\ 
\hline
\end{tabular}
\end{center}
\end{table}
`

Что мне нужно, это преобразовать эту матрицу в массив измерения (5,6,2), в котором первая матрица содержит первые пять строк «x», а вторая матрица будет содержать последние 5 строк. Я пытался

dim(x)<-c(5,6,2)

, что дает матрицу-1 с 1:30 последовательными числами, а затем матрицу-2 с 31:60 последовательными числами. Что не является моим требованием.

Заранее спасибо.

Ответы [ 3 ]

10 голосов
/ 06 марта 2012

То, что вы предложили, является представлением LaTeX. Та же матрица в R будет

M <- matrix(1:60, ncol=6)  # a 10 x 6 matrix

Попробуйте использовать abind из пакета "abind":

require(abind)
abind( M[1:5,], M[6:10, ], along=3 )
#-----------------
, , 1

     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]    1   11   21   31   41   51
[2,]    2   12   22   32   42   52
[3,]    3   13   23   33   43   53
[4,]    4   14   24   34   44   54
[5,]    5   15   25   35   45   55

, , 2

     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]    6   16   26   36   46   56
[2,]    7   17   27   37   47   57
[3,]    8   18   28   38   48   58
[4,]    9   19   29   39   49   59
[5,]   10   20   30   40   50   60

Если вы не хотите использовать внешний пакет и согласитесь на транспонированную версию каждого среза, то сначала перенесите, а затем измените размер. Вы не можете транспонировать массив, однако есть функция aperm, на которую вы можете посмотреть:

Mt <- t(M)
dim(Mt) <- c(6, 5, 2)
Mt
, , 1

     [,1] [,2] [,3] [,4] [,5]
[1,]    1    2    3    4    5
[2,]   11   12   13   14   15
[3,]   21   22   23   24   25
[4,]   31   32   33   34   35
[5,]   41   42   43   44   45
[6,]   51   52   53   54   55

, , 2

     [,1] [,2] [,3] [,4] [,5]
[1,]    6    7    8    9   10
[2,]   16   17   18   19   20
[3,]   26   27   28   29   30
[4,]   36   37   38   39   40
[5,]   46   47   48   49   50
[6,]   56   57   58   59   60

Раствор для спермы:

> aperm(Mt, c(2,1,3))
, , 1

     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]    1   11   21   31   41   51
[2,]    2   12   22   32   42   52
[3,]    3   13   23   33   43   53
[4,]    4   14   24   34   44   54
[5,]    5   15   25   35   45   55

, , 2

     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]    6   16   26   36   46   56
[2,]    7   17   27   37   47   57
[3,]    8   18   28   38   48   58
[4,]    9   19   29   39   49   59
[5,]   10   20   30   40   50   60
1 голос
/ 06 марта 2012

Как насчет:

M <- matrix(1:60,nrow=10)

M2 <- lapply(split(M,0:9%/%5),matrix,nrow=5)
M2
$`0`
     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]    1   11   21   31   41   51
[2,]    2   12   22   32   42   52
[3,]    3   13   23   33   43   53
[4,]    4   14   24   34   44   54
[5,]    5   15   25   35   45   55

$`1`
     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]    6   16   26   36   46   56
[2,]    7   17   27   37   47   57
[3,]    8   18   28   38   48   58
[4,]    9   19   29   39   49   59
[5,]   10   20   30   40   50   60

И если вам действительно нужно array:

array(unlist(M2),c(5,6,2))
0 голосов
/ 05 марта 2012

Я не могу сказать, действительно ли ваши образцы данных находятся в той форме XML-вывода, или они просто выглядят так :-).Пока у вас в настоящее время есть двумерная матрица, полная данных в R, ответ Чейза, вероятно, подойдет.Если вы хотите быть очень осторожным, попробуйте

data.cube <- array(NA, dim = c(5,6,2))  
data.cube[,,1] <- your.matrix[1:5,]  
data.cube[,,2] <- your.matrix[6:10,]   

Это педантично, но я надеюсь, что оно укажет на некоторые удобные способы подачи данных в массив в R.

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