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])
}
基本上我有两个矩阵:
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])
}