Конвертировать сложенные матрицы в блочную матрицу - PullRequest
0 голосов
/ 23 мая 2018

Мои текущие данные - это серия 3x3 matrices, которые накладываются друг на друга.Структура выглядит следующим образом (следующий пример - 3 matrices, хотя мои фактические данные намного больше / длиннее):

0   1   1
0   0   1
1   1   0
0   1   1
1   0   1
1   0   0
0   1   1
0   0   1
1   1   0

Используя R, я бы хотел, чтобы это выглядело так:

0   1   1                       
0   0   1                       
1   1   0                       
            0   1   1           
            1   0   1           
            1   0   0           
                        0   1   1
                        0   0   1
                        1   1   0

Ответы [ 2 ]

0 голосов
/ 23 мая 2018

Вы можете использовать split вместе с переменной, которая группирует каждый набор из 3 строк.

split(as.data.frame(mat), ceiling(seq_len(nrow(mat) / 3)))

data:

mat <- matrix(sample(0:1, 9*3, replace=TRUE), ncol=3)
0 голосов
/ 23 мая 2018

Мы split matrix до list матриц по индексу группировки, созданному с помощью gl и применяем bdiag (из Matrix), чтобы получить диагональную матрицу разреженной матрицы

library(Matrix)
m2 <- bdiag(lapply(split(d1, as.integer(gl(nrow(d1), 3, nrow(d1)))), as.matrix))
m2
#9 x 9 sparse Matrix of class "dgCMatrix"
#                       
# [1,] . 1 1 . . . . . .
# [2,] . . 1 . . . . . .
# [3,] 1 1 . . . . . . .
# [4,] . . . . 1 1 . . .
# [5,] . . . 1 . 1 . . .
# [6,] . . . 1 . . . . .
# [7,] . . . . . . . 1 1
# [8,] . . . . . . . . 1
# [9,] . . . . . . 1 1 .

, который можно преобразовать в обычную матрицу, обернув as.matrix

as.matrix(m2)

data

m1 <- structure(c(0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 
       1, 1, 1, 0, 1, 1, 0, 1, 1, 0), .Dim = c(9L, 3L))
d1 <- as.data.frame(m1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...