【问题标题】:Split a large matrix every N columns?每 N 列拆分一个大矩阵?
【发布时间】:2020-04-13 13:23:54
【问题描述】:

有谁知道每 N 列拆分一个矩阵的优雅方法?这是一个大矩阵,所以我不想将其转换为数据表,我想使用 base R。

【问题讨论】:

  • 您能否提供更多详细信息。你想如何检索矩阵部分?
  • 我有一个大约 10,000 列的数字矩阵。我想最终得到一个子矩阵列表,每个子矩阵都有 100 列。由于它是一个如此大的对象,我不想通过数据帧中间。

标签: r matrix split


【解决方案1】:

你可以试试

mout <- Map(as.matrix,split.default(as.data.frame(m),ceiling(seq(ncol(m))/N)))

示例

> mout
$`1`
     V1 V2 V3 V4
[1,]  4  1 23 18
[2,] 39 34 14 33

$`2`
     V5 V6 V7 V8
[1,] 21 10 35  7
[2,] 32 22 30  9

$`3`
     V9 V10 V11 V12
[1,] 15   5  28  19
[2,] 31  25  29   2

$`4`
     V13 V14 V15 V16
[1,]  27  36  38   3
[2,]  20  12  40   6

$`5`
     V17 V18 V19 V20
[1,]  17  24  37  16
[2,]   8  11  26  13

数据

set.seed(1)
m <- matrix(sample(40),ncol = 20)
N <- 4

【讨论】:

    【解决方案2】:

    我们可以使用lapply

    N <- 2
    list_mat <- lapply(seq_len(ncol(mat)/N) - 1, function(x) 
                       mat[,(N * x + 1) : (N * x+2)])
    list_mat
    #[[1]]
    #      [,1] [,2]
    # [1,]    1   11
    # [2,]    2   12
    # [3,]    3   13
    # [4,]    4   14
    # [5,]    5   15
    # [6,]    6   16
    # [7,]    7   17
    # [8,]    8   18
    # [9,]    9   19
    #[10,]   10   20
    
    #[[2]]
    #      [,1] [,2]
    # [1,]   21   31
    # [2,]   22   32
    # [3,]   23   33
    # [4,]   24   34
    #...
    

    这直接有效,因为您有 10,000 (ncol) 列,并希望将它们分成 100 (N) 列。即ncol 可以被N 整除。

    数据

    mat <- matrix(1:100, ncol = 10)
    

    【讨论】:

      【解决方案3】:

      我们可以使用glsplitting创建索引

      lapply(split(seq_len(ncol(mat)), as.integer(gl(ncol(mat), 2, ncol(mat)))),
             function(i) mat[,i])
      

      数据

      mat <- matrix(1:100, ncol = 10)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-08-17
        • 2014-10-16
        • 2021-06-25
        • 1970-01-01
        • 1970-01-01
        • 2013-04-28
        • 1970-01-01
        • 2023-03-21
        相关资源
        最近更新 更多