2014-03-06 114 views
0

如何从多个列向量创建矩阵?从多个列向量创建矩阵

我知道,我可以轻松地创建一个数据帧与列向量:

> colA <- 1:5 
> colB <- 21:25 
> colC <- 31:35 
> data.frame(colA, colB, colC) 
    colA colB colC 
1 1 21 31 
2 2 22 32 
3 3 23 33 
4 4 24 34 
5 5 25 35 

然而,当我尝试matrix(),它给了我意想不到的效果,如下图所示。如何创建我想要的矩阵?我知道我可以做as.matrix(df),这很好地保留了列名,但我正在寻找更直接的方法。

> matrix(colA, colB, colC) 
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] 
[1,] 1 2 3 4 5 1 2 3 4  5  1  2  3 
[2,] 2 3 4 5 1 2 3 4 5  1  2  3  4 
[3,] 3 4 5 1 2 3 4 5 1  2  3  4  5 
[4,] 4 5 1 2 3 4 5 1 2  3  4  5  1 
[5,] 5 1 2 3 4 5 1 2 3  4  5  1  2 
[6,] 1 2 3 4 5 1 2 3 4  5  1  2  3 
[7,] 2 3 4 5 1 2 3 4 5  1  2  3  4 
[8,] 3 4 5 1 2 3 4 5 1  2  3  4  5 
[9,] 4 5 1 2 3 4 5 1 2  3  4  5  1 
[10,] 5 1 2 3 4 5 1 2 3  4  5  1  2 
[11,] 1 2 3 4 5 1 2 3 4  5  1  2  3 
[12,] 2 3 4 5 1 2 3 4 5  1  2  3  4 
[13,] 3 4 5 1 2 3 4 5 1  2  3  4  5 
[14,] 4 5 1 2 3 4 5 1 2  3  4  5  1 
[15,] 5 1 2 3 4 5 1 2 3  4  5  1  2 
[16,] 1 2 3 4 5 1 2 3 4  5  1  2  3 
[17,] 2 3 4 5 1 2 3 4 5  1  2  3  4 
[18,] 3 4 5 1 2 3 4 5 1  2  3  4  5 
[19,] 4 5 1 2 3 4 5 1 2  3  4  5  1 
[20,] 5 1 2 3 4 5 1 2 3  4  5  1  2 
[21,] 1 2 3 4 5 1 2 3 4  5  1  2  3 
     [,14] [,15] [,16] [,17] [,18] [,19] [,20] [,21] [,22] [,23] [,24] [,25] 
[1,]  4  5  1  2  3  4  5  1  2  3  4  5 
[2,]  5  1  2  3  4  5  1  2  3  4  5  1 
[3,]  1  2  3  4  5  1  2  3  4  5  1  2 
[4,]  2  3  4  5  1  2  3  4  5  1  2  3 
[5,]  3  4  5  1  2  3  4  5  1  2  3  4 
[6,]  4  5  1  2  3  4  5  1  2  3  4  5 
[7,]  5  1  2  3  4  5  1  2  3  4  5  1 
[8,]  1  2  3  4  5  1  2  3  4  5  1  2 
[9,]  2  3  4  5  1  2  3  4  5  1  2  3 
[10,]  3  4  5  1  2  3  4  5  1  2  3  4 
[11,]  4  5  1  2  3  4  5  1  2  3  4  5 
[12,]  5  1  2  3  4  5  1  2  3  4  5  1 
[13,]  1  2  3  4  5  1  2  3  4  5  1  2 
[14,]  2  3  4  5  1  2  3  4  5  1  2  3 
[15,]  3  4  5  1  2  3  4  5  1  2  3  4 
[16,]  4  5  1  2  3  4  5  1  2  3  4  5 
[17,]  5  1  2  3  4  5  1  2  3  4  5  1 
[18,]  1  2  3  4  5  1  2  3  4  5  1  2 
[19,]  2  3  4  5  1  2  3  4  5  1  2  3 
[20,]  3  4  5  1  2  3  4  5  1  2  3  4 
[21,]  4  5  1  2  3  4  5  1  2  3  4  5 
     [,26] [,27] [,28] [,29] [,30] [,31] 
[1,]  1  2  3  4  5  1 
[2,]  2  3  4  5  1  2 
[3,]  3  4  5  1  2  3 
[4,]  4  5  1  2  3  4 
[5,]  5  1  2  3  4  5 
[6,]  1  2  3  4  5  1 
[7,]  2  3  4  5  1  2 
[8,]  3  4  5  1  2  3 
[9,]  4  5  1  2  3  4 
[10,]  5  1  2  3  4  5 
[11,]  1  2  3  4  5  1 
[12,]  2  3  4  5  1  2 
[13,]  3  4  5  1  2  3 
[14,]  4  5  1  2  3  4 
[15,]  5  1  2  3  4  5 
[16,]  1  2  3  4  5  1 
[17,]  2  3  4  5  1  2 
[18,]  3  4  5  1  2  3 
[19,]  4  5  1  2  3  4 
[20,]  5  1  2  3  4  5 
[21,]  1  2  3  4  5  1 
Warning message: 
In matrix(colA, colB, colC) : 
    data length [5] is not a sub-multiple or multiple of the number of rows [21] 
+2

'cbind(colA,colB,colC)'应该可以工作。 – josliber

+0

谢谢。您应该回答这个问题,以便我可以标记您的解决方案。为什么矩阵(colA,colB,colC)不起作用? – stackoverflowuser2010

+1

你调用矩阵(colA,colB,colC)在R中被解释为矩阵(data = colA,nrow = colB,ncol = colC)这就是为什么你有21行和31列作为R,显然只需要第一行数据提供给nrow和ncol作为行数/列数。 看帮助(矩阵)如何传递参数 –

回答

4

您可以使用cbind产生所需的矩阵:

mat <- cbind(colA, colB, colC) 
mat 
#  colA colB colC 
# [1,] 1 21 31 
# [2,] 2 22 32 
# [3,] 3 23 33 
# [4,] 4 24 34 
# [5,] 5 25 35 
class(mat) 
# [1] "matrix" 

你不明白你用matrix(colA, colB, colC)通话期待矩阵,因为你的论点越来越解释为第一,第二个和第三个参数为matrix函数(又名datanrowncol)。如果你想使用矩阵函数,你需要提供数据作为单个参数,如mat <- matrix(c(colA, colB, colC), ncol=3)。如果你使用这个语法,你不会像变量cbind那样从变量中获得列名。