代码之家  ›  专栏  ›  技术社区  ›  dan

熔化稀疏矩阵(dgCMatrix)并保持其零点

  •  0
  • dan  · 技术社区  · 4 年前

    我有一个大的 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 s 熔化 需要强制执行此操作 dgCMatrix a matrix 对于我正在处理的尺寸,这个过程非常缓慢。所以我在寻找更有效的东西。

    我想 mefa4 s 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 的手册提供了这一点。有什么替代方案吗?

    0 回复  |  直到 4 年前
        1
  •  0
  •   dan    4 年前

    数据:

    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 s melt 被胁迫者 matrix mefa4 s 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