【发布时间】:2020-04-13 13:23:54
【问题描述】:
有谁知道每 N 列拆分一个矩阵的优雅方法?这是一个大矩阵,所以我不想将其转换为数据表,我想使用 base R。
【问题讨论】:
-
您能否提供更多详细信息。你想如何检索矩阵部分?
-
我有一个大约 10,000 列的数字矩阵。我想最终得到一个子矩阵列表,每个子矩阵都有 100 列。由于它是一个如此大的对象,我不想通过数据帧中间。
有谁知道每 N 列拆分一个矩阵的优雅方法?这是一个大矩阵,所以我不想将其转换为数据表,我想使用 base R。
【问题讨论】:
你可以试试
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
【讨论】:
我们可以使用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)
【讨论】:
我们可以使用gl为splitting创建索引
lapply(split(seq_len(ncol(mat)), as.integer(gl(ncol(mat), 2, ncol(mat)))),
function(i) mat[,i])
mat <- matrix(1:100, ncol = 10)
【讨论】: