2017-01-20 2 views
1

У меня есть большая разреженная матрица и вы хотите ранжировать ее столбцы с ненулевыми элементами по столбцу. Подход, который я использую сейчас, состоит в том, чтобы преобразовать все нули в NA. Проблема с этим подходом заключается в том, что матрица не является более редкой и имеет пространственные сложности при этом.Ранг не нули элементов столбца по столбцу в разреженной матрице

Есть ли способ использовать функцию rank без преобразования нулей в NA? Воспроизводимый пример:

library(Matrix) 

TestMatrix = Matrix(c(0,100,12,0,11, 
         0,100,12,0,11, 
         0,100,12,0,11, 
         0,100,12,0,11, 
         0,100,12,0,11), 5, sparse = TRUE) 

TestMatrix = replace(TestMatrix, TestMatrix == 0, NA) 

apply(-TestMatrix, 2, function(x) {rank(x, na.last = TRUE)}) 

Я хочу разреженную матрицу того же размера, с ненулевыми значениями заменены столбцами рангом.

+0

ли ненулевое Vales в вашей матрице действительно все положительным, как в вашем примере? – Gregor

+0

Да. Все значения положительны. –

+0

Я должен был обновить это в вопросе. Да, мой ожидаемый результат - это разреженная матрица того же размера, но с ненулевыми значениями, замененными рангом –

ответ

1

Вашего пример TestMatrix:

#5 x 5 sparse Matrix of class "dgCMatrix" 
#       
#[1,] . . . . . 
#[2,] 100 100 100 100 100 
#[3,] 12 12 12 12 12 
#[4,] . . . . . 
#[5,] 11 11 11 11 11 

Я хочу разреженную матрицу того же размера, с ненулевыми значениями заменены столбцами рангом.

n <- diff([email protected]) ## number of non-zeros per column 
lst <- split([email protected], rep.int(1:ncol(TestMatrix), n)) ## columns to list 
r <- unlist(lapply(lst, rank)) ## column-wise ranking and result collapsing 
RankMatrix <- TestMatrix ## copy sparse matrix 
[email protected] <- r ## replace non-zero elements with rank 

#5 x 5 sparse Matrix of class "dgCMatrix" 
#    
#[1,] . . . . . 
#[2,] 3 3 3 3 3 
#[3,] 2 2 2 2 2 
#[4,] . . . . . 
#[5,] 1 1 1 1 1