【问题标题】:how to partition the data with specific row size如何对具有特定行大小的数据进行分区
【发布时间】:2021-08-07 04:48:26
【问题描述】:

假设我有以下矩阵:

X = matrix(rnorm(4000), nrow=400, ncol=10)
size = c(80,80,79,80,81)

我想以简洁的方式根据上述大小对矩阵进行逐行分区。为了说明,

x1 = X[1:80,]
x2 = X[81:160,]
.
.
x5 = X[320:400,]

我通常有不同的尺寸和不同的矩阵,所以我无法每次都手动执行此操作。非常感谢您的帮助。

【问题讨论】:

    标签: r matrix split


    【解决方案1】:

    试试下面的代码

    e <- cumsum(size)
    b <- c(1, head(e + 1, -1))
    out <- Map(function(rb, re) X[rb:re, ], b, e)
    

    你会看到

    > str(out)
    List of 5
     $ : num [1:80, 1:10] 0.253 -0.368 0.804 -0.603 -0.119 ...
     $ : num [1:80, 1:10] 0.467 -0.743 -0.401 1.48 0.853 ...
     $ : num [1:79, 1:10] -1.123 -0.873 -1.039 -0.247 -0.774 ...
     $ : num [1:80, 1:10] -1.409 -0.683 -0.514 0.485 -0.347 ...
     $ : num [1:81, 1:10] 0.58 0.529 -0.803 0.49 -0.847 ...
    

    另外,如果你想创建变量,试试

    list2env(setNames(out,paste0("x",seq_along(out))),envir = .GlobalEnv)
    

    【讨论】:

      【解决方案2】:

      您可以使用cumsum 获取起点和终点,并使用Map 对其进行子集化并创建矩阵列表。

      X = matrix(rnorm(4000), nrow=400, ncol=10)
      size = c(80,80,79,80,81)
      
      val <- cumsum(size)
      result <- Map(function(x, y) X[x:y, ], c(1, val[-length(val)] + 1), val)
      

      其中c(1, val[-length(val)] + 1) 创建起始行号,val 是结束行号。

      c(1, val[-length(val)] + 1)
      #[1]   1  81 161 240 320
      
      val
      #[1]  80 160 239 319 400
      

      【讨论】:

        【解决方案3】:

        使用map2

        library(purrr)
        size1 <- cumsum(size)
        map2(size1, c(1, size1[-length(size1)] + 1), ~ X[.x:.y,])
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-01-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-07-08
          • 2022-01-23
          相关资源
          最近更新 更多