【问题标题】:Finding nth percentile in a matrix with conditions在具有条件的矩阵中查找第 n 个百分位数
【发布时间】:2020-01-30 12:29:40
【问题描述】:

我有一个 100 行 x 10 列的矩阵:

mat1 = matrix(1:1000, nrow = 100, ncol = 10)

我希望使用 colQuantiles 找到每列的第 n 个百分位数,其中第 n 个百分位数等于 Probs 中包含的概率值,除非 Probs 中的任何值 > 0.99 - 在这种情况下,我想要 0.99 的值应用。

Probs = c(0.99, 0.95, 1, 1, 0.96, 0.92, 1, 0.98, 0.99, 1)

我尝试了以下方法:

Res = ifelse(Probs > 0.99, colQuantiles(mat1, Probs = c(0.99)), colQuantiles(mat1, probs = Probs))

但这只是针对 mat1 的所有十列返回上述语句的 if true 部分,大概是因为 Probs 中至少有一个值 > 0.99。如何调整上述内容,以便根据 Probs 中的概率单独处理 mat1 的每一列?

【问题讨论】:

    标签: r


    【解决方案1】:

    你可以使用mapply如下:

    Probs[Probs > 0.99] <- 0.99
    unname(mapply(function(x, p) quantile(x, p), 
        split(mat1, rep(1:ncol(mat1), each = nrow(mat1))),
        Probs))
    

    输出:

    [1]  99.01 195.05 299.01 399.01 496.04 592.08 699.01 798.02 899.01 999.01
    

    它将矩阵拆分为一组列向量(请参阅How to convert a matrix to a list of column-vectors in R?),然后找到每列的第 n 个百分位数。

    【讨论】:

      【解决方案2】:

      我们不能为colQuantiles 中的不同列传递不同的概率,但我们可以使用colQuantiles 获得每列的所有概率

      temp <- matrixStats::colQuantiles(mat1, probs = pmin(Probs, 0.99))
      

      然后提取矩阵的对角线,得到每列所需的概率。

      diag(temp)
      #[1]  99.01 195.05 299.01 399.01 496.04 592.08 699.01 798.02 899.01 999.01
      

      【讨论】:

      • 像上面一样,这也很好用。非常感谢您提供的好解决方案。
      猜你喜欢
      • 2016-08-16
      • 2017-12-23
      • 2016-11-02
      • 2012-12-28
      • 2010-11-10
      • 1970-01-01
      • 1970-01-01
      • 2011-03-05
      • 1970-01-01
      相关资源
      最近更新 更多