Разделить большую матрицу каждые N столбцов? - PullRequest
0 голосов
/ 13 апреля 2020

Кто-нибудь знает элегантный способ разбить матрицу на каждые N столбцов? Это большая матрица, поэтому я не хочу преобразовывать ее в таблицу данных, и я бы хотел использовать базу R.

Ответы [ 3 ]

1 голос
/ 13 апреля 2020

Мы можем использовать 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.

data

mat <- matrix(1:100, ncol = 10)
1 голос
/ 13 апреля 2020

Мы можем использовать gl для создания индекса для split ting

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

data

mat <- matrix(1:100, ncol = 10)
1 голос
/ 13 апреля 2020

Вы можете попробовать

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
...