如何在R中生成带循环的n矩阵

时间:2017-10-27 12:35:51

标签: r matrix

我有5个(旧)暗淡的Constants.DATE_NAME + " DESC"矩阵。我想创建1000个新的dim 1000*35矩阵,以便从5个旧矩阵的第一行创建第一个矩阵。第二个矩阵是从5个旧矩阵的第二行创建的,依此类推。

我该怎么办?请指导我。

4 个答案:

答案 0 :(得分:1)

首先cbind所有五个矩阵(称之为m1, ..., m5),然后为apply

每行创建一个新矩阵
new.matrices <- apply(cbind(m1, m2, m3, m4, m5), 1, function(row) matrix(row, 5, 35))

这为您提供了矩阵的列表。

答案 1 :(得分:0)

要使用此处发布的示例,rbind所有矩阵,请执行以下操作:

 A=rbind(matrix1, matrix2, matrix3, matrix4, matrix5)
 lapply(0:(nrow(A)/5-1),function(x)A[1:5+5*x,])

这比分割数据要快得多。

答案 2 :(得分:0)

首先,我在这里解析了这个问题:

问题:将{ n i 行和 j 列}转换为{ i n 行和 j 列}的矩阵

约束新矩阵的 x y 等于旧矩阵中的行 y X

以下是我建议的,通用的解决方案(尺寸小于 在提出的问题中,为了介绍)。结果是 和@ ANG的答案一样,但是我们可以避免写出for循环, 并且必须减少写出原始矩阵的手工工作。

n <- 3  # number of old matrices
i <- 5  # number of rows in old matrices
j <- 4  # number of columns in old matrices

# Create a list containing the original matrices.
old_matrices <- lapply(seq_len(n), matrix, nrow = i, ncol = j)

# Paste all the original matrices together by column.
m <- do.call(cbind, old_matrices)

大矩阵m的每一行现在代表一个新的矩阵 它的行连接在一起形成一个向量。

# Construct the new matrices from the rows in the big matrix.
new_matrices <- tapply(m, row(m), matrix, nrow = n, byrow = T)

然后进行一些检查以确保我们做了我们应该做的事情:

new_matrices[[1]]
#>      [,1] [,2] [,3] [,4]
#> [1,]    1    1    1    1
#> [2,]    2    2    2    2
#> [3,]    3    3    3    3

# Check that there's the right number of new matrices
length(new_matrices) == i
#> [1] TRUE

# Check that the new matrices all have the correct dimensions
all(vapply(new_matrices, function(m) all.equal(dim(m), c(n, j)), logical(1)))
#> [1] TRUE

# Check that the constraint holds
all(vapply(seq_along(new_matrices), function(y) {
  vapply(seq_along(old_matrices), function(x) {
    all.equal(new_matrices[[y]][x, ], old_matrices[[x]][y, ])
  }, logical(1))
}, logical(n)))
#> [1] TRUE

答案 3 :(得分:-1)

您还可以使用for()循环。这是一个详细的例子

# old matrices
old.mat1 <- matrix(data = sample(35000), nrow = 1000, ncol = 35)
old.mat2 <- matrix(data = sample(35000), nrow = 1000, ncol = 35)
old.mat3 <- matrix(data = sample(35000), nrow = 1000, ncol = 35)
old.mat4 <- matrix(data = sample(35000), nrow = 1000, ncol = 35)
old.mat5 <- matrix(data = sample(35000), nrow = 1000, ncol = 35)

rbind(old.mat1[1, ], old.mat2[1, ], old.mat3[1, ], old.mat4[1, ],
      old.mat5[1, ]) # how we will build new matrices
dim(rbind(old.mat1[1, ], old.mat2[1, ], old.mat3[1, ], old.mat4[1, ],
          old.mat5[1, ])) # you can see that dim is 5*35

new.mat <- list() # list of new matrices
for(i in 1:1000){
        new.mat[[i]] <- rbind(old.mat1[i, ], old.mat2[i, ], old.mat3[i, ],
                              old.mat4[i, ], old.mat5[i, ])
}

new.mat1 <- new.mat[[1]] # first new matrix
length(new.mat) # new.mat contains the 1000 new matrices