For Loop将输出存储为列表然后组合成矩阵

时间:2018-01-30 16:55:15

标签: r

我有一个矩阵列表,我想首先转换成单个向量,然后将它们组合成一个大矩阵。我一直在尝试实现一个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])

我的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)

任何帮助都会很棒!谢谢!

1 个答案:

答案 0 :(得分:0)

要使用for循环,我会这样做:

z = list()
for (i in seq_along(mylist)) {
    z[[i]] = c(mylist[[i]])
} 

但是当你只是将一个简单的函数应用于每个列表元素时,lapply非常好:

z = lapply(mylist, c)

如果您想要cbind所有这些向量,我们可以使用Reducedo.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