簡體   English   中英

將函數(分位數)應用於矩陣行並使用結​​果修改行

[英]Apply function (quantile) to matrix rows and use result to modify row

我有一個矩陣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

rowQuantilesmatrixStats包:

library(matrixStats)
res <- A / rowQuantiles(A, probs=0.75)

結果一樣嗎?

identical(apply(A, 1, quantile, probs=0.75), rowQuantiles(A, probs=0.75))
[1] TRUE

它更快嗎?

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 

在這個矩陣上,絕對可以。

在更大的矩陣(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 

不那么引人注目,但仍然可以(忽略最大值)。

通過使用apply解決了該問題,如下所示:

A <- matrix(rnorm(10 * 10), 10, 10)
q <- apply(A, 1, quantile, probs = c(0.75),  na.rm = TRUE)
A <- A/q

從技術上講,它回答了這個問題,但是矢量化方法會很好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM