如何从 R 中的向量列表制作矩阵?
Posted
技术标签:
【中文标题】如何从 R 中的向量列表制作矩阵?【英文标题】:How do I make a matrix from a list of vectors in R? 【发布时间】:2010-11-22 17:31:42 【问题描述】:目标:从等长的向量列表中,创建一个矩阵,其中每个向量变成一行。
例子:
> 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
【问题讨论】:
【参考方案1】:一种选择是使用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
【讨论】:
所以这和标准 rbind() 的区别在于 do.call() 将每个列表项作为单独的 arg 传递 - 对吗? do.call(rbind,a) 等价于 rbind(a[[1]], a[[2]]... a[[10]])? do.call() 非常适合此目的,我希望它在介绍性材料中得到更好的“记录”。【参考方案2】: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
【讨论】:
【参考方案3】:并不简单,但它确实有效:
> 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
【讨论】:
使用rjson
结果,colMeans
仅适用于此方法!谢谢!【参考方案4】:
内置的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
【讨论】:
或者按列填充矩阵然后转置:t( matrix( unlist(a), ncol=length(a) ) )
。【参考方案5】:
t(sapply(a, '[', 1:max(sapply(a, length))))
其中“a”是一个列表。 适用于不相等的行大小
【讨论】:
【参考方案6】:> 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
【讨论】:
如果行的长度不同,这将根本不起作用,而 do.call(rbind,...) 仍然有效。 任何线索如何使它适用于不相等的行大小与 NA 缺失的行数据? @rwst 实际上, do.call(rbind,...) 不适用于不等长向量,除非您真的打算在最后填充行时重用向量。请参阅 Arihant 的回复,了解在末尾填充NA
值的方式。以上是关于如何从 R 中的向量列表制作矩阵?的主要内容,如果未能解决你的问题,请参考以下文章