如何从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
内置的matrix
function有很好的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