这是关于有效处理大
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
有更有效的方法吗?
完整代表:
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