rbind 使用 for 循环输出多个矩阵

rbind using for loop outputting several matrices

基本上我有两个矩阵:

A<-matrix(runif(10*10),ncol = 10) 
B<-matrix(runif(10*10),ncol = 10) 

我正在尝试创建一个 for 循环,它将: a) 删除矩阵 A 的第一行并将矩阵 B 的第一行添加到新矩阵 A 的底部,以创建矩阵 a。

b) 删除矩阵 A 的前 2 行,并将矩阵 B 的前 2 行添加到新矩阵 A 的底部,以创建矩阵 b

c) 删除矩阵 A 的前 3 行,并将矩阵 B 的前 3 行添加到新矩阵 A 的底部,以创建矩阵 c . . .

我可以像下面的代码那样手动编写,但我需要为更大的矩阵执行此操作,所以会花费更长的时间:

a<-rbind(A[2:10,],B[1:1,]) 
b<-rbind(A[3:10,],B[1:2,]) 
c<-rbind(A[4:10,],B[1:3,]) 
d<-rbind(A[5:10,],B[1:4,]) 
. 
. 
. 

这是我创建 for 循环的尝试:

A<-matrix(c(rep(0,10*10)),nrow=10) 
n<-10 
for (i in 1:n-1){ 
  A<-rbind(R[(i+1):10,],ER[(1:i),]) 
} 

这只输出 n-1 矩阵,但我希望输出所有矩阵。

此函数对任意行数执行您想要的操作nrows

switch_matrices <- function(mat1, mat2, nrows){
  rbind(mat1[(1+nrows):nrow(mat1),],mat2[1:nrows,]) 
}

您可以检查它是否有效

all.equal(rbind(A[2:10,],B[1:1,]) ,switch_matrices(A,B, 1))

在每个列表元素中列出所有数据框。

l <- lapply(1:9, function(nrows) switch_matrices(A,B, nrows))

如果你想让列表的每个元素 l 在你的全局环境中成为一个单独的变量,你可以使用

list2env(setNames(l,paste0("AB",seq_along(l))), envir = parent.frame())

一个想法是创建一个将矩阵和行作为参数的函数。然后用lapply迭代,

fun1 <- function(x, y, n) { rbind(x[n:nrow(x),], y[1:n-1,])}
lapply(2:nrow(A), function(i) fun1(A, B, i))

我对您的解决方案做了一些更改,我使用了提供列表的变量 letters,例如 letters[2]=b.

为了将每个新矩阵分配给一个动态变量,我使用了函数 assign

A<-matrix(runif(10*10),ncol = 10) 
B<-matrix(runif(10*10),ncol = 10) 
n<-nrow(A) 

for (i in 1:(n-1)){ 
  assign(letters[i],rbind(A[(i+1):10,],B[(1:i),]))
  paste(letters[i])
}