Плавление разреженной матрицы (dgCMatrix) и сохранение ее нулей

#r #sparse-matrix #melt

#r #разреженная матрица #плавление

Вопрос:

У меня есть большой sparse matrix ( Matrix dgCMatrix объект пакета R ).

Игрушечный пример:

 m <- Matrix(c(0,0,2:0), 3,5)
rownames(m) <- paste0("g",1:3)
colnames(m) <- paste0("c",1:3)
> m
3 x 5 sparse Matrix of class "dgCMatrix"
   c1 c2 c3 c4 c5
g1  .  1  .  .  2
g2  .  .  2  .  1
g3  2  .  1  .  .
  

И я хочу, чтобы melt это было a data.frame .

reshape2 для этого melt требуется принудительное преобразование этого dgCMatrix в matrix объект, и для измерений, с которыми я работаю, это происходит очень медленно. Итак, я ищу что-то более эффективное.

Я думал mefa4 Melt , что это сработает, но это отбрасывает нулевые значения:

 > mefa4::Melt(m)
  rows cols value
1   g3   c1     2
2   g1   c2     1
3   g2   c3     2
4   g3   c3     1
5   g1   c5     2
6   g2   c5     1
  

И я хотел бы сохранить их, и я не вижу параметра в mefa4::Melt руководстве, обеспечивающего это. Есть идеи по альтернативе?

Комментарии:

1. Весь смысл разреженной матрицы в том, что в ней нет нулей.

Ответ №1:

данные:

 m <- Matrix(c(0,0,2:0), 3,5)
rownames(m) <- paste0("g",1:3)
colnames(m) <- paste0("c",1:5)
  

Решение:

 data.frame(rows=rownames(x)[row(x)],cols=colnames(x)[col(x)],value=as.numeric(x))
  

Кажется, это быстрее, чем reshape2 melt принудительные matrix и mefa4 Melt :

 mf <- function(x){
  mefa4::Melt(x)
}

df <- function(x){
  data.frame(rows=rownames(x)[row(x)],cols=colnames(x)[col(x)],value=as.numeric(x))
}

rs <- function(x){
  reshape2::melt(Matrix::as.matrix(x))
}

microbenchmark::microbenchmark(df(m))
Unit: microseconds
  expr     min      lq     mean  median      uq      max neval
 df(m) 330.378 376.887 778.3489 476.903 699.743 14953.47   100

microbenchmark::microbenchmark(rs(m))
Unit: microseconds
  expr     min      lq     mean  median       uq     max neval
 rs(m) 537.328 638.683 1197.268 726.679 1042.261 15073.3   100

microbenchmark::microbenchmark(mf(m))
Unit: microseconds
  expr     min       lq     mean   median       uq      max neval
 mf(m) 459.947 526.6585 1023.575 677.9775 1007.214 6712.497   100