将函数(分位数)应用于矩阵行并使用结​​果修改行

Tho*_*hew 4 r matrix

我有一个矩阵 A,其中填充了形状为 10x10 的随机值。如何对每一行执行函数(找到第 75 个分位数),并将 A 的该行中的每个元素除以该结果?

在下面的尝试中,我得到了 q 的单个值,但 q 应该至少有 10 个值(每行一个)。那时我应该能够使用 进行按元素除法A/q。我究竟做错了什么?

A <- matrix(rnorm(10 * 10), 10, 10)
q <- c(quantile(A[1,], 0.75))
A/q
Run Code Online (Sandbox Code Playgroud)

lmo*_*lmo 6

rowQuantiles包装里有matrixStats

library(matrixStats)
res <- A / rowQuantiles(A, probs=0.75)
Run Code Online (Sandbox Code Playgroud)

结果一样吗?

identical(apply(A, 1, quantile, probs=0.75), rowQuantiles(A, probs=0.75))
[1] TRUE
Run Code Online (Sandbox Code Playgroud)

更快吗?

library(microbenchmark)

    microbenchmark(apply=apply(A, 1, quantile, probs=0.75),
                   matStat=rowQuantiles(A, probs=0.75))
    Unit: microseconds
        expr     min       lq    mean   median      uq       max neval cld
       apply 788.298 808.9675 959.816 829.3515 855.154 13259.652   100   b
     matStat 246.611 267.2800 278.302 276.1180 284.386   362.075   100  a 
Run Code Online (Sandbox Code Playgroud)

在这个矩阵上,肯定是这样。

如果是更大的矩阵(1000 X 1000)呢?

A <- matrix(rnorm(1e6), 1000, 1000)

microbenchmark(apply=apply(A, 1, quantile, probs=0.75),
               matStat=rowQuantiles(A, probs=0.75))
Unit: milliseconds
    expr       min       lq     mean    median       uq      max neval cld
   apply 115.57328 123.4831 183.1455 139.82021 308.3715 353.1725   100   b
 matStat  74.22657  89.2162 136.1508  95.41482 113.0969 745.1526   100  a 
Run Code Online (Sandbox Code Playgroud)

没有那么引人注目,但仍然是(忽略最大值)。