Alejandro Sanchez
Alejandro Sanchez

Reputation: 23

Enumerate quantiles in reverse order

I'm trying to get the quantile number of a column in a data frame, but in reverse order. I want the highest number to be in quantile number 1.

Here is what I have so far:

> x<-c(10, 12, 75, 89, 25, 100, 67, 89, 4, 67, 120.2, 140.5, 170.5, 78.1)
> x <- data.frame(x)
> within(x, Q <- as.integer(cut(x, quantile(x, probs=0:5/5, na.rm=TRUE), 
  include.lowest=TRUE)))

       x Q
1   10.0 1
2   12.0 1
3   75.0 3
4   89.0 4
5   25.0 2
6  100.0 4
7   67.0 2
8   89.0 4
9    4.0 1
10  67.0 2
11 120.2 5
12 140.5 5
13 170.5 5
14  78.1 3

And what I want to get is:

       x Q
1   10.0 5
2   12.0 5
3   75.0 3
4   89.0 2
5   25.0 4
6  100.0 2
7   67.0 4
8   89.0 2
9    4.0 5
10  67.0 4
11 120.2 1
12 140.5 1
13 170.5 1
14  78.1 3

Upvotes: 2

Views: 944

Answers (1)

LJW
LJW

Reputation: 815

One way to do this is to specify the reversed labels in the cut() function. If you want Q to be an integer then you need to first coerce the factor labels into a character and then into an integer.

result <- within(x, Q <- as.integer(as.character((cut(x, 
                              quantile(x, probs = 0:5/5, na.rm = TRUE), 
                              labels = c(5, 4, 3, 2, 1),
                              include.lowest = TRUE)))))
head(result)
    x Q
1  10 5
2  12 5
3  75 3
4  89 2
5  25 4
6 100 2

Your data:

x <- c(10, 12, 75, 89, 25, 100, 67, 89, 4, 67, 120.2, 140.5, 170.5, 78.1)
x <- data.frame(x)

Upvotes: 2

Related Questions