我有一个矩阵列表,我想先转换为单个向量,然后将它们组合成一个大矩阵。我一直在尝试实现一个 for 循环来做到这一点,但一直无法成功。
示例数据:列表中的 5 个 10x10 矩阵
m1 <- matrix(1:100, nrow = 10, ncol = 10)
m2 <- matrix(1:100, nrow = 10, ncol = 10)
m3 <- matrix(1:100, nrow = 10, ncol = 10)
m4 <- matrix(1:100, nrow = 10, ncol = 10)
m5 <- matrix(1:100, nrow = 10, ncol = 10)
mylist <- list(m1, m2, m3, m4, m5)
我可以使用以下内容将单个矩阵转换为向量:
unlist(mylist[1])
My for 循环如下所示,目前将它们全部输出到单个向量中:
z = list()
for (i in mylist[length(mylist)]) {
n <- unlist(mylist)
z <- c(n)
}
length(z)
[1] 500
我想要的输出是 df:
m1 <- unlist(mylist[1])
m2 <- unlist(mylist[2])
m3 <- unlist(mylist[3])
m4 <- unlist(mylist[4])
m5 <- unlist(mylist[5])
df <- cbind(m1, m2, m3, m4, m5)
任何帮助都会很棒!谢谢!
要使用 for 循环,我会这样做:
z = list()
for (i in seq_along(mylist)) {
z[[i]] = c(mylist[[i]])
}
但是当你只是对每个列表元素应用一个简单的函数时,lapply
非常好:
z = lapply(mylist, c)
如果您想cbind
所有这些向量,我们可以使用 Reduce
或do.call
:
do.call(what = cbind, args = z)
Reduce(f = cbind, x = z)
do.call
相当于cbind(z[[1]], z[[2]], z[[3]], ...)
,Reduce
相当于cbind(z[[1]], cbind(z[[2]], cbind(z[[3]], ...)))
。由于cbind
接受任意数量的参数,因此do.call
可能更好。例如,如果要添加或相乘向量,则需要Reduce
。