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

Marc Schwartz (via MN) mschwartz at mn.rr.com
Tue Jul 26 22:18:20 CEST 2005

```On Tue, 2005-07-26 at 15:48 -0400, jhainm at 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

```