2015-08-05 1 views
1

Как слить два больших (около 500 тыс. Столбцов и строк) разреженных матриц формального класса dgCMatrix с разными размерами (как столбцы, так и строки) в R?Объединить две разреженные матрицы dgCMatrix разного размера в R

Simplyfied пример: У меня есть полная матрица 6х6

1 2 3 4 5 6 
1 0 0 0 0 0 0 
2 0 0 0 0 0 0 
3 0 0 0 0 0 0 
4 0 0 0 0 0 0 
5 0 0 0 0 0 0 
6 0 0 0 0 0 0 

Теперь я хочу, чтобы объединить вторую матрицу разного размера:

3 4 5 6 
1 0 1 0 0 
3 0 0 1 0 
4 1 0 0 0 

Результат должен быть:

1 2 3 4 5 6 
1 0 0 0 1 0 0 
2 0 0 0 0 0 0 
3 0 0 0 0 1 0 
4 1 0 0 0 0 0 
5 0 0 0 0 0 0 
6 0 0 0 0 0 0 

Я пробовал cbindX и сливался, но оба они не работали:

только матрицы и data.frames могут быть использованы

или

не может заставить класс "* структура (" dgCMatrix "пакет = "Матрица")" к данным. Рамка.

Однако я не мог изменить свою матрицу sparse=FALSE матрицы класса, как предложено здесь in this post или к data.frame, так как в этом случае R не может справиться с размером матрицы на моей машине больше.

Любая помощь будет высоко оценена. Благодаря!

ответ

5

Одной из стратегий было бы преобразование матриц обратно в один размер и их добавление.

A <- sparseMatrix(8, 8, x = 1) 
B <- sparseMatrix(c(1,3,5), c(3,6,3), x = c(1,4,1)) 

Вы можете получить доступ индексов матрицы B с summary(B), а затем просто воссоздать матрицу с разреженной матрицей (I, J, х, тускнеет), как вы бы нормальную работа Подменят в R:

> summary(B) 
5 x 6 sparse Matrix of class "dgCMatrix", with 3 entries 
    i j x 
1 1 3 1 
2 5 3 1 
3 3 6 4 

B <- sparseMatrix(i = summary(B)$i, j = summary(B)$j, x = summary(B)$x, dims = dim(A)) 

Затем вы можете просто добавить матрицы:

A = A + B 
+0

Хорошая идея - хорошо работает, спасибо большое! Я не мог упрекнуть вас, поскольку у меня пока нет достаточно очков. – Flo