# Re: [R] elegant solution to transform vector into percentages?

From: Marc Schwartz (via MN) <mschwartz_at_mn.rr.com>
Date: Wed 27 Jul 2005 - 06:18:20 EST

On Tue, 2005-07-26 at 15:48 -0400, jhainm@fas.harvard.edu wrote:
> Hi,
>
> I am looking for an elegant way to transform a vector into percentages of values
> that meet certain criteria.
>
> store<-c(1,1.4,3,1.1,0.3,0.6,4,5)
>
> # now I want to get the precentages of values
> # that fall into the categories <=M , >M & <=N , >N
> # let
> M <-.8
> N <- 1.2
> # In my real example I have many more of these cutoff-points
>
> # What I did is:
>
> out <- matrix(NA,1,3)
>
> out[1,1] <- ( (sum(store<=M )) /length(store) )*100
> out[1,2] <- ( (sum(store> M & store<= N )) /length(store) )*100
> out[1,3] <- ( (sum(store> N )) /length(store) )*100
>
> colnames(out)<-c("percent<=M","percent>M & <=N","percent>N")
> out
>
> But this gets very tedious if I have many cutoff-points. Does anybody know a
> more elegant way to do this task?
>
> Thanks so much.
>
> Cheers,
> Jens

Something alone the lines of:

store <- c(1, 1.4, 3, 1.1, 0.3, 0.6, 4, 5) M <- 0.8
N <- 1.2

x <- hist(store, br = c(min(store), M, N, max(store)),

plot = FALSE)\$counts

pct.x <- prop.table(x) * 100

names(pct.x) <- c("percent <= M","percent > M & <= N","percent > N")

> pct.x

```      percent <= M percent > M & <= N        percent > N
25                 25                 50

```

I think that should do it. See ?hist for more information and take note of the 'include.lowest' and 'right' arguments relative to whether or not values are or are not included in the specified intervals.

See ?prop.table as well.

Also be acutely aware of potential problems with exact equality comparisons with floating point numbers and the break points...if you have a float value equal to a breakpoint in your vector.

HTH, Marc Schwartz

R-help@stat.math.ethz.ch mailing list