【问题标题】:rbind using for loop outputting several matricesrbind 使用 for 循环输出几个矩阵
【发布时间】:2016-08-17 10:11:44
【问题描述】:

所以基本上我有两个矩阵:

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 矩阵,但我希望输出所有矩阵。

【问题讨论】:

    标签: r for-loop matrix output rbind


    【解决方案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())
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 这似乎有点眼熟;)
      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-12
        • 1970-01-01
        • 2021-02-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多