[R] Function to assign quantiles?

Talbot Katz topkatz at msn.com
Fri Feb 16 16:48:29 CET 2007


Thank you so much to all who replied on and off list.  It's good to have so 
many options!  One of the off-list responders also mentioned the quantcut 
function in the gtools package.

--  TMK  --
212-460-5430	home
917-656-5351	cell



>From: "hadley wickham" <h.wickham at gmail.com>
>To: f.harrell at vanderbilt.edu
>CC: marc_schwartz at comcast.net, r-help at stat.math.ethz.ch, "Talbot Katz" 
><topkatz at msn.com>
>Subject: Re: [R] Function to assign quantiles?
>Date: Fri, 16 Feb 2007 19:51:49 +1300
>
>On 2/16/07, Frank E Harrell Jr <f.harrell at vanderbilt.edu> wrote:
>>Marc Schwartz wrote:
>> > On Thu, 2007-02-15 at 17:50 -0500, Talbot Katz wrote:
>> >> Hi.
>> >>
>> >> If I call the quantiles function as follows:
>> >>
>> >> qvec = quantiles(dvals,probs=seq(0,1,0.1))
>> >>
>> >> the results will return a vector something like the following example:
>> >>
>> >>       0%    10%    20%    30%     40%     50%    60%    70%      80%   
>>   90%
>> >>      100%
>> >>     56.0   137.3   238.4   317.9   495.8   568.5   807.4  1207.7  
>>1713.0
>> >> 2951.1  8703.0
>> >>
>> >> Now I want to assign the deciles, 1 - 10, to each observation, so, in 
>>the
>> >> above example, if dvals[322] = 256, I want to assign qvals[322] = 3, 
>>and if
>> >> dvals[7216] = 1083, I want qvals[7216] = 7, etc.  I would think there 
>>would
>> >> be a function, or some very quick code to do that, but I couldn't find 
>>it.
>> >>
>> >> Here's what I have now.  It works, but I figure there must be a better 
>>way:
>> >>
>> >> asdc <- function(q){max(1,which(qvec<q))}
>> >> qvals = apply(matrix(dvals,nrow=1),2,asdc)
>> >>
>> >>
>> >> Any suggestions?  Thanks!
>> >
>> > Take a look at ?cut and use the output of quantile() to define the
>> > 'breaks' argument:
>> >
>> > x <- rnorm(100)
>> >
>> >> cut(x, breaks = quantile(x, probs = seq(0, 1, 0.1)),
>> >       include.lowest = TRUE, labels = 1:10)
>> >   [1] 2  1  9  10 9  3  1  7  5  2  4  1  10 8  4  10 9  9  5  3  5  8
>> >  [23] 6  9  7  1  10 1  10 9  3  3  9  3  5  5  6  4  8  10 6  2  2  8
>> >  [45] 6  3  6  9  1  4  7  10 8  7  5  3  1  10 2  1  7  8  8  2  8  8
>> >  [67] 3  10 4  6  5  1  4  6  4  4  5  9  9  7  2  8  2  5  1  3  7  6
>> >  [89] 4  6  4  6  2  7  2  10 7  3  5  7
>> > Levels: 1 2 3 4 5 6 7 8 9 10
>> >
>> >
>> > HTH,
>> >
>> > Marc Schwartz
>> >
>> > ______________________________________________
>> > R-help at stat.math.ethz.ch mailing list
>> > https://stat.ethz.ch/mailman/listinfo/r-help
>> > PLEASE do read the posting guide 
>>http://www.R-project.org/posting-guide.html
>> > and provide commented, minimal, self-contained, reproducible code.
>>
>>Or see the cut2 function in the Hmisc package
>
>Or the chop function in ggplot package - it's a common problem.
>
>Hadley



More information about the R-help mailing list