基本上我有两个矩阵:
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矩阵,但我希望输出所有矩阵。
答案 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])
}