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

时间:2016-08-17 10:11:45

标签: r for-loop matrix output rbind

基本上我有两个矩阵:

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

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

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

c)去除矩阵A的3个顶行,并将3个顶行矩阵B添加到新矩阵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矩阵,但我希望输出所有矩阵。

3 个答案:

答案 0 :(得分: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())

答案 1 :(得分:1)

一个想法是创建一个以矩阵和行为参数的函数。然后使用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))

答案 2 :(得分:0)

我对您的解决方案进行了一些更改,并使用了提供列表的变量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])
}