Подать заявку на sparseMatrix в R
Мне интересно, есть ли способ выполнить какой-то apply
функция на sparseMatrix
(от Matrix
Пакет) в R, чтобы вырезать столбцы на k
одинаковые группы?
И можно ли разделить для групп только те элементы в столбце, которые больше 0?
Для маленьких sparseMatrix
код выглядит так, но я уверен, что он не будет работать эффективно на больших матрицах.
library(Matrix)
i <- c(1:8, rep(8,7)); j <- c(1:8, 1:7); x <- c(8 * (1:8),1:7)
(A <- sparseMatrix(i, j, x = x))
#8 x 8 sparse Matrix of class "dgCMatrix"
[1,] 8 . . . . . . .
[2,] . 16 . . . . . .
[3,] . . 24 . . . . .
[4,] . . . 32 . . . .
[5,] . . . . 40 . . .
[6,] . . . . . 48 . .
[7,] . . . . . . 56 .
[8,] 1 2 3 4 5 6 7 64
>
"
> k<- 2
> apply(A,2,function(element){
+ cut(element,
+ k)})
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
[1,] "(4,8.01]" "(-0.016,8]" "(-0.024,12]" "(-0.032,16]" "(-0.04,20]" "(-0.048,24]" "(-0.056,28]" "(-0.064,32]"
[2,] "(-0.008,4]" "(8,16]" "(-0.024,12]" "(-0.032,16]" "(-0.04,20]" "(-0.048,24]" "(-0.056,28]" "(-0.064,32]"
[3,] "(-0.008,4]" "(-0.016,8]" "(12,24]" "(-0.032,16]" "(-0.04,20]" "(-0.048,24]" "(-0.056,28]" "(-0.064,32]"
[4,] "(-0.008,4]" "(-0.016,8]" "(-0.024,12]" "(16,32]" "(-0.04,20]" "(-0.048,24]" "(-0.056,28]" "(-0.064,32]"
[5,] "(-0.008,4]" "(-0.016,8]" "(-0.024,12]" "(-0.032,16]" "(20,40]" "(-0.048,24]" "(-0.056,28]" "(-0.064,32]"
[6,] "(-0.008,4]" "(-0.016,8]" "(-0.024,12]" "(-0.032,16]" "(-0.04,20]" "(24,48]" "(-0.056,28]" "(-0.064,32]"
[7,] "(-0.008,4]" "(-0.016,8]" "(-0.024,12]" "(-0.032,16]" "(-0.04,20]" "(-0.048,24]" "(28,56.1]" "(-0.064,32]"
[8,] "(-0.008,4]" "(-0.016,8]" "(-0.024,12]" "(-0.032,16]" "(-0.04,20]" "(-0.048,24]" "(-0.056,28]" "(32,64.1]"
0 ответов
Три возможных подхода:
- Преобразуйте разреженную матрицу в
data.table
- Преобразовать в
simple_triplet_matrix
и использоватьrollup
функция отslam
пакет. - Преобразуйте разреженную матрицу в список столбцов и используйте
vapply
Варианты 1 и 3 поддерживают параллельную обработку по столбцам. Вариант 3 имеет наименьшее количество зависимостей. Реализация варианта 3 доступна как частьquminorm
пакет. Если найду время, в будущем могу выделить его в отдельный пакет. Обратите внимание, что для функций, которые также требуют нулевых значений, лучший подход - использовать функциюcolapply_simple_triplet_matrix
из пакета slam
.
Вот виньетка, сравнивающая множество различных схем с точки зрения скорости и потребления памяти.