将稀疏 R 整数 dgCMatrix 转换为相应的稀疏 R 秩 dgCMatrix

问题描述 投票:0回答:1

这是关于有效处理大

R
稀疏
Matrix
dgCMatrix
)的另一个问题:

我想将现有的 ~15,000 x ~90,000

dgCMatrix
转换为相应的排名
dgCMatrix
,其中排名意味着每列为其每一行分配一个排名。

apply
方式进行操作将是:

rank.mat <- apply(mat, 2, function(i) dplyr::dense_rank(i))-1

这样零值将获得排名

0
,列中最小的非零元素将获得排名
1

不幸的是,这是 RAM 密集型的并且在我的 Mac 上给了我这个错误:

Error: vector memory exhausted (limit reached?)

还有这些警告:

In addition: Warning message:
In asMethod(object) :
  sparse->dense coercion: allocating vector of size 9.2 GiB

有更有效的方法吗?

r memory sparse-matrix rank
1个回答
0
投票

完整代表:

library(Matrix)

m <- 15e3L
n <- 9e4L
x <- 15e5L

mat <- sparseMatrix(
  i = c(sample(m, x - 1L, 1), m),
  j = c(sample(n, x - 1L, 1), n),
  x = runif(x)
)

f <- function(m) {
  maxx <- max(m@x) + 1
  m@x <- rank(rep(maxx*(0:(ncol(m) - 1)), diff(m@p)) + m@x) - rep(m@p[-length(m@p)], diff(m@p))
  m
}

rank.mat <- f(mat)

i <- mat@i[1:16] + 1L
mat[i, 1]
#>  [1] 0.74158472 0.89724032 0.40739106 0.02595116 0.96454579 0.49204336
#>  [7] 0.97001135 0.71967759 0.99530421 0.17614453 0.53408557 0.95027102
#> [13] 0.66232766 0.15156502 0.43420076 0.86203289
rank.mat[i, 1]
#>  [1] 13 15  6  1 17  9 18 12 19  3 10 16 11  2  8 14
© www.soinside.com 2019 - 2024. All rights reserved.