【问题标题】:Melting a sparse matrix (dgCMatrix) and keeping its zeros熔化稀疏矩阵(dgCMatrix)并保持其零
【发布时间】:2020-10-22 11:37:36
【问题描述】:

我有一个大的sparse matrixMatrix 中的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 发送到data.frame

reshape2melt 需要将此dgCMatrix 强制转换为matrix 对象,并且对于我正在处理的维度而言,这非常慢。所以我正在寻找更高效的东西。

我认为mefa4Melt 可以解决问题,但它会丢弃零值:

> 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 的手册中没有看到提供该参数的参数。关于替代方案的任何想法?

【问题讨论】:

  • 稀疏矩阵的全部意义在于它没有任何零。

标签: r sparse-matrix melt


【解决方案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))

这似乎比强制的matrixmefa4Meltreshape2melt 快​​:

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

【讨论】:

    猜你喜欢
    • 2017-10-03
    • 1970-01-01
    • 2018-12-10
    • 1970-01-01
    • 2020-04-20
    • 2015-10-27
    • 2017-06-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多