[R] Avoiding for loops

Dimitris Rizopoulos d.rizopoulos at erasmusmc.nl
Mon Nov 2 11:39:07 CET 2009


you could try something along these lines:

data <- data.frame(y = rnorm(100), group = rep(1:10, each = 10))

data$sum <- ave(data$y, data$group, FUN = sum)
data$norm.y <- data$y / data$sum
data


I hope it helps.

Best,
Dimitris


Noah Silverman wrote:
> Hi,
> 
> I'm trying to normalize some data.
> My data is organized by groups.  I want to normalize PER GROUP as 
> opposed to over the entire data set.
> 
> The current double loop that I'm using takes almost an hour to run on 
> about 30,000 rows of data in 2,500 groups.
> 
> I'm currently doing this:
> 
> -------------------------------------
> for(group in unique(data$group)){
>     sum_V1 <- sum(data$V1[data$group == group])
> 
>     for(subject in data$subject[data$group == group]){
>         data$V1_norm[(data$group == group & data$subject == subject)] <- 
> data$V1[(data$group == group & data$subject == subject)] / sum_V1
>     }
> }
> -------------------------------------
> 
> Can anyone point me to a faster way to do this in R.
> 
> Thanks!
> 
> -N
> 
> ______________________________________________
> 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.
> 

-- 
Dimitris Rizopoulos
Assistant Professor
Department of Biostatistics
Erasmus University Medical Center

Address: PO Box 2040, 3000 CA Rotterdam, the Netherlands
Tel: +31/(0)10/7043478
Fax: +31/(0)10/7043014




More information about the R-help mailing list