我有一个矩阵,A,填充了形状为10x10的随机值 . 如何在每一行上执行一个函数(找到第75个分位数),并按该结果划分A行中的每个元素?
在下面的尝试中,我得到q的单个值,但q应该至少为10个值(每行一个) . 那时我应该能够用 A/q 进行元素划分 . 我究竟做错了什么?
A/q
A <- matrix(rnorm(10 * 10), 10, 10) q <- c(quantile(A[1,], 0.75)) A/q
使用 apply 解决了该问题,如下所示:
apply
A <- matrix(rnorm(10 * 10), 10, 10) q <- apply(A, 1, quantile, probs = c(0.75), na.rm = TRUE) A <- A/q
它在技术上回答了这个问题,但是矢量化的方法会很好 .
matrixStats 包中有 rowQuantiles :
matrixStats
rowQuantiles
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
不那么戏剧化,但仍然是(忽略最大值) .
2 回答
使用
apply
解决了该问题,如下所示:它在技术上回答了这个问题,但是矢量化的方法会很好 .
matrixStats
包中有rowQuantiles
:结果相同?
它更快吗?
绝对是在这个矩阵上 .
在更大的矩阵(1000 X 1000)上怎么样?
不那么戏剧化,但仍然是(忽略最大值) .