从多个列向量创建矩阵

时间:2014-03-06 19:44:02

标签: r dataframe

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

我知道我可以使用列向量轻松创建数据框:

> 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]

1 个答案:

答案 0 :(得分:6)

您可以使用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函数的第一,第二和第三个参数(aka { {1}},datanrow)。如果您想使用矩阵函数,则需要将您的数据作为单个参数提供,例如ncol。如果您使用了这种语法,则不会像使用mat <- matrix(c(colA, colB, colC), ncol=3)那样从变量中获取列名。