如何从 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 中的向量列表制作矩阵?的主要内容,如果未能解决你的问题,请参考以下文章

如何将矩阵转换为R中的列向量列表?

如何将向量附加为 R 矩阵中的列?

是否有一个函数从matlab中的索引向量制作邻接矩阵?

如何将矩阵的每一行除以R中的向量元素

如何将两列“计数”矩阵转换为 R 中的二进制向量? [复制]

R语言实战——矩阵与列表的操作示例