# Re: [R] a more elegant way to get percentages?

From: Dimitris Rizopoulos <dimitris.rizopoulos_at_med.kuleuven.be>
Date: Thu, 13 Mar 2008 14:45:42 +0100

try the following:

```1      a   5
2      b   5
3      b  15
4      c   5
5      c  20
6      c   5
7      c  10
8      d   5
9      d  15
10     d  10"), header = TRUE)

```

x\$percent1 <- unlist(tapply(x\$val, x\$locat, function(x){

round(100 * x / sum(x), 2)
}))
x

however, check whether the levels of the factor 'x\$locat' are appropriately ordered.

I hope it helps.

Best,
Dimitris

Dimitris Rizopoulos
Biostatistical Centre
School of Public Health
Catholic University of Leuven

```Tel: +32/(0)16/336899
Fax: +32/(0)16/337015
Web: http://med.kuleuven.be/biostat/
http://www.student.kuleuven.be/~m0390867/dimitris.htm

```
• Original Message ----- From: "Monica Pisica" <pisicandru_at_hotmail.com> To: <r-help_at_r-project.org> Sent: Thursday, March 13, 2008 2:36 PM Subject: [R] a more elegant way to get percentages?

>
> Hi,
>
> I am trying to get percentages in a more elegant way. I have a
> data.frame with locations and values (counts) of species at that
> location. Each location is repeated for each species i have values
> for and i would like to get percentages of each species at that
> location. I am not sure if i am clear in my explanations so i will
> paste my code below:
>
> #####################
>
>> x
> locat val
> 1 a 5
> 2 b 5
> 3 b 15
> 4 c 5
> 5 c 20
> 6 c 5
> 7 c 10
> 8 d 5
> 9 d 15
> 10 d 10
>> loc1 <- x\$locat
>> n <- length(loc1)
>> locuniq1 <- unique(loc1)
>> m <- length(locuniq1)
>> counts <- seq(1:m)
>>
>> for (i in 1:m) {
> + count <- 0
> + for (j in 1:n) {
> + if (loc1[j]==locuniq1[i]) count <- count+1
> + counts[i] <- count
> + }
> + }
>>
>> percent1 <- rep(0,n)
>> j <- 0
>> for (i in 1:m) {
> +
> + b <- x[(j+1):(j+counts[i]),]
> + total <- sum(b\$val)
> + percent1[(j+1):(j+counts[i])] <- round(apply(as.matrix(b\$val), 1,
> function(x) {x*100/total}),2)
> + j = j+counts[i]
> + }
>> x1 <- cbind(x, percent1) # this is the result i want
>> x1
> locat val percent1
> 1 a 5 100.00
> 2 b 5 25.00
> 3 b 15 75.00
> 4 c 5 12.50
> 5 c 20 50.00
> 6 c 5 12.50
> 7 c 10 25.00
> 8 d 5 16.67
> 9 d 15 50.00
> 10 d 10 33.33
>>
> ################
>
> I am wondering if there is any way to do it more efficiently, much
> more that the first loop which gives how many times each location is
> present in the data.frame is slow if you have a larger data.frame
> and not only 10 rows.
>
> Thanks for any input and sorry if the email is on the long side,
>
> Monica
>
>
> _________________________________________________________________
> [[elided Hotmail spam]]
>
> ______________________________________________
> R-help_at_r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help