如何从 R 中的向量列表中创建一个矩阵?

目标: 从等长的向量列表中,创建一个矩阵,其中每个向量成为一行。

例如:

> 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
117350 次浏览

一种选择是使用 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
> 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
t(sapply(a, '[', 1:max(sapply(a, length))))

其中“ a”是一个列表。 将对不等的行大小起作用

内置的 matrix函数提供了输入数据 byrow的好选项。将它与源列表中的 unlist相结合,将得到一个矩阵。我们还需要指定行数,以便分解未列出的数据。那就是:

> 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

simplify2array是一个相当直观的基本函数。但是,由于 R 的默认值是首先按列填充数据,因此需要转换输出。(sapply使用 simplify2array,如 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