From: Dimitris Rizopoulos <dimitris.rizopoulos_at_med.kuleuven.be>

Date: Thu, 13 Mar 2008 14:45:42 +0100

Dimitris Rizopoulos

Biostatistical Centre

School of Public Health

Catholic University of Leuven

R-help_at_r-project.org 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. Received on Thu 13 Mar 2008 - 17:04:49 GMT

Date: Thu, 13 Mar 2008 14:45:42 +0100

try the following:

x <- read.table(textConnection("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"), 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

Address: Kapucijnenvoer 35, Leuven, Belgium

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
**> PLEASE do read the posting guide
**> http://www.R-project.org/posting-guide.html
**> and provide commented, minimal, self-contained, reproducible code.
**>
*

Disclaimer: http://www.kuleuven.be/cwis/email_disclaimer.htm

R-help_at_r-project.org 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. Received on Thu 13 Mar 2008 - 17:04:49 GMT

Archive maintained by Robert King, hosted by
the discipline of
statistics at the
University of Newcastle,
Australia.

Archive generated by hypermail 2.2.0, at Thu 13 Mar 2008 - 17:30:21 GMT.

*
Mailing list information is available at https://stat.ethz.ch/mailman/listinfo/r-help.
Please read the posting
guide before posting to the list.
*