DJ-AFC
DJ-AFC

Reputation: 569

Finding nth percentile in a matrix with conditions

I have a matrix measuring 100 rows x 10 columns:

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

I wish to find the nth percentile of each column using colQuantiles, where the nth percentile is equal to a probability value contained in Probs, except when any of the values in Probs > 0.99 - in which case I want the value of 0.99 applied.

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

I have tried the following:

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

But this simply returns the if true part of the above statement for all ten columns of mat1, presumably because there at least one of the values in Probs is > 0.99. How can I adapt the above so it treats each column of mat1 individually according to the probabilities in Probs?

Upvotes: 0

Views: 103

Answers (2)

Ronak Shah
Ronak Shah

Reputation: 388797

We cannot pass different probability for different columns in colQuantiles but we can get all the probabilities for each column using colQuantiles

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

and then extract the diagonal of the matrix to get the required probability in each column.

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

Upvotes: 3

chinsoon12
chinsoon12

Reputation: 25225

You can use mapply as follows:

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

output:

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

It splits the matrix into a set of column vectors (see How to convert a matrix to a list of column-vectors in R?) and then find the nth percentile for each column.

Upvotes: 3

Related Questions