如何将矩阵转换为数组?

时间:2012-03-05 19:27:19

标签: arrays r matrix transformation

我有一个大型数据集,我想将其转换为数组。但是举个例子让我们举个简单的例子。 我有以下矩阵

`\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 个答案:

答案 0 :(得分:10)

您提供的是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 :(得分: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))

答案 2 :(得分: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中数组的方便方法。