[R] tapply within a data.frame: a simpler alternative?

David Freedman 3.14david at gmail.com
Thu Dec 11 17:02:17 CET 2008


You might take a look at the transformBy function in the doBy package

For example, 
new.df=transformBy(~group,data=my.df, new=y/max(y))

David Freedman


baptiste auguie-2 wrote:
> 
> Dear list,
> 
> I have a data.frame with x, y values and a 3-level factor "group",  
> say. I want to create a new column in this data.frame with the values  
> of y scaled to 1 by group. Perhaps the example below describes it best:
> 
>> x <- seq(0, 10, len=100)
>> my.df <- data.frame(x = rep(x, 3), y=c(3*sin(x), 2*cos(x),  
>> cos(2*x)), # note how the y values have a different maximum  
>> depending on the group
>> 	group = factor(rep(c("sin", "cos", "cos2"), each=100)))
>> library(reshape)	
>> df.melt <- melt(my.df, id=c("x","group")) # make a long format
>> df.melt <- df.melt[ order(df.melt$group) ,] # order the data.frame  
>> by the group factor
>> df.melt$norm <- do.call(c, tapply(df.melt$value, df.melt$group,  
>> function(.v) {.v / max(.v)})) # calculate the normalised value per  
>> group and assign it to a new column
>> library(lattice)
>> xyplot(norm + value ~ x,groups=group,  data=df.melt, auto.key=T) #  
>> check that it worked
> 
> 
> This procedure works, but it feels like I'm reinventing the wheel  
> using hammer and saw. I tried to use aggregate, by, ddply (plyr  
> package), but I coudn't find anything straight-forward.
> 
> I'll appreciate any input,
> 
> Baptiste
> 
> 
> 
> 
> 
> _____________________________
> 
> Baptiste Auguié
> 
> School of Physics
> University of Exeter
> Stocker Road,
> Exeter, Devon,
> EX4 4QL, UK
> 
> Phone: +44 1392 264187
> 
> http://newton.ex.ac.uk/research/emag
> 
> ______________________________________________
> 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.
> 
> 


-----
David Freedman
Atlanta
-- 
View this message in context: http://www.nabble.com/tapply-within-a-data.frame%3A-a-simpler-alternative--tp20939647p20958347.html
Sent from the R help mailing list archive at Nabble.com.



More information about the R-help mailing list