用R查找矩阵中每一行的分位数的最快方法是什么?

问题描述

D <- matrix(rnorm(2000),nrow=2,ncol=1000)

t(matrix(c(quantile(D[1,],c(0.05,0.95)),quantile(D[2,0.95))),nrow=2))

我有一个2×1000矩阵,每个矩阵的列都是对(X,Y)的观察。我想找到每行相同的分位数。说q_0.05和q_0.95。最快的计算方法是什么?

解决方法

尝试matrixStats::rowQuantiles

library(matrixStats)
microbenchmark::microbenchmark(baseR=apply(D,1,quantile,c(0.05,0.95)),matrixStats=rowQuantiles(D,probs=c(.05,.95)),times=10L)

# Unit: milliseconds
#        expr     min       lq     mean   median       uq      max neval cld
#       baseR 222.127 227.1580 238.7553 229.6283 233.1329 326.8730    10   b
# matrixStats 145.262 160.9838 171.9204 161.8530 168.4477 263.1476    10  a 

y1 <- t(apply(D,c(.05,.95)))
y2 <- rowQuantiles(D,.95))
stopifnot(all.equal(y1,y2))

数据:

set.seed(42)
D <- matrix(rnorm(2e6),nrow=2,ncol=2e6)