2012-03-05 3 views
1

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

`\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), в котором первая матрица содержит первые пять строк «х» и второй матрицы будет содержать последние 5 строк. Я попытался

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

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

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

+0

вы можете начать с 'массив (yourMatrixHere, тусклые = с (5, 6,2) '... вам может понадобиться возиться с тем, как он заполняет эти измерения. – Chase

+0

Можете ли вы объяснить, пожалуйста, как я могу попросить R для заполнения этих массивов? – Iftikhar

ответ

10

Что вы предложили это La Представление TeX. Та же матрица 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 

The АПРОН решение:

> 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 
+2

В разделе «S Poetry» есть глава в массивах с более высокой размерностью, которая может быть полезной, включая некоторые больше объяснений «аперма». http://www.burns-stat.com/pages/spoetry.html –

0

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

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

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

+0

Спасибо за ваш ответ. Но на самом деле мне нужен какой-то трюк для обработки большой матрицы. – Iftikhar

1

Как насчет:

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)) 
Смежные вопросы