Подать заявку на 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 ответов

Три возможных подхода:

  1. Преобразуйте разреженную матрицу в data.table
  2. Преобразовать в simple_triplet_matrix и использовать rollup функция от slam пакет.
  3. Преобразуйте разреженную матрицу в список столбцов и используйте vapply

Варианты 1 и 3 поддерживают параллельную обработку по столбцам. Вариант 3 имеет наименьшее количество зависимостей. Реализация варианта 3 доступна как частьquminormпакет. Если найду время, в будущем могу выделить его в отдельный пакет. Обратите внимание, что для функций, которые также требуют нулевых значений, лучший подход - использовать функциюcolapply_simple_triplet_matrix из пакета slam.

Вот виньетка, сравнивающая множество различных схем с точки зрения скорости и потребления памяти.

Другие вопросы по тегам