如何从R中的向量列表中创build一个matrix?

目标:从长度相等的向量列表中创build一个matrix,其中每个向量成为一行。

例:

> a <- list() > for (i in 1:10) a[[i]] <- c(i,1:5) > a [[1]] [1] 1 1 2 3 4 5 [[2]] [1] 2 1 2 3 4 5 [[3]] [1] 3 1 2 3 4 5 [[4]] [1] 4 1 2 3 4 5 [[5]] [1] 5 1 2 3 4 5 [[6]] [1] 6 1 2 3 4 5 [[7]] [1] 7 1 2 3 4 5 [[8]] [1] 8 1 2 3 4 5 [[9]] [1] 9 1 2 3 4 5 [[10]] [1] 10 1 2 3 4 5 

我想要:

  [,1] [,2] [,3] [,4] [,5] [,6] [1,] 1 1 2 3 4 5 [2,] 2 1 2 3 4 5 [3,] 3 1 2 3 4 5 [4,] 4 1 2 3 4 5 [5,] 5 1 2 3 4 5 [6,] 6 1 2 3 4 5 [7,] 7 1 2 3 4 5 [8,] 8 1 2 3 4 5 [9,] 9 1 2 3 4 5 [10,] 10 1 2 3 4 5 

一个select是使用do.call()

  > do.call(rbind, a) [,1] [,2] [,3] [,4] [,5] [,6] [1,] 1 1 2 3 4 5 [2,] 2 1 2 3 4 5 [3,] 3 1 2 3 4 5 [4,] 4 1 2 3 4 5 [5,] 5 1 2 3 4 5 [6,] 6 1 2 3 4 5 [7,] 7 1 2 3 4 5 [8,] 8 1 2 3 4 5 [9,] 9 1 2 3 4 5 [10,] 10 1 2 3 4 5 

不直接,但它的工作原理:

 > t(sapply(a, unlist)) [,1] [,2] [,3] [,4] [,5] [,6] [1,] 1 1 2 3 4 5 [2,] 2 1 2 3 4 5 [3,] 3 1 2 3 4 5 [4,] 4 1 2 3 4 5 [5,] 5 1 2 3 4 5 [6,] 6 1 2 3 4 5 [7,] 7 1 2 3 4 5 [8,] 8 1 2 3 4 5 [9,] 9 1 2 3 4 5 [10,] 10 1 2 3 4 5 

simplify2array是一个相当直观的基本function。 但是,由于R的默认设置是首先按列填充数据,所以您需要转置输出。 ( sapply使用simplify2array ,如help(sapply)文档help(sapply) 。)

 > t(simplify2array(a)) [,1] [,2] [,3] [,4] [,5] [,6] [1,] 1 1 2 3 4 5 [2,] 2 1 2 3 4 5 [3,] 3 1 2 3 4 5 [4,] 4 1 2 3 4 5 [5,] 5 1 2 3 4 5 [6,] 6 1 2 3 4 5 [7,] 7 1 2 3 4 5 [8,] 8 1 2 3 4 5 [9,] 9 1 2 3 4 5 [10,] 10 1 2 3 4 5 

内置的matrixfunction有很好的select来input数据。 把它与你的源列表中的unlist结合起来会给你一个matrix。 我们还需要指定行数,以便分解未列出的数据。 那是:

 > matrix(unlist(a), byrow=TRUE, nrow=length(a) ) [,1] [,2] [,3] [,4] [,5] [,6] [1,] 1 1 2 3 4 5 [2,] 2 1 2 3 4 5 [3,] 3 1 2 3 4 5 [4,] 4 1 2 3 4 5 [5,] 5 1 2 3 4 5 [6,] 6 1 2 3 4 5 [7,] 7 1 2 3 4 5 [8,] 8 1 2 3 4 5 [9,] 9 1 2 3 4 5 [10,] 10 1 2 3 4 5 
 t(sapply(a, '[', 1:max(sapply(a, length)))) 

其中'a'是一个列表。 将工作不相等的行大小

 > library(plyr) > as.matrix(ldply(a)) V1 V2 V3 V4 V5 V6 [1,] 1 1 2 3 4 5 [2,] 2 1 2 3 4 5 [3,] 3 1 2 3 4 5 [4,] 4 1 2 3 4 5 [5,] 5 1 2 3 4 5 [6,] 6 1 2 3 4 5 [7,] 7 1 2 3 4 5 [8,] 8 1 2 3 4 5 [9,] 9 1 2 3 4 5 [10,] 10 1 2 3 4 5