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

baptiste auguie ba208 at exeter.ac.uk
Wed Dec 10 18:28:52 CET 2008

```Excellent! I completely forgot its name and existence. Perhaps ave
should be mentioned on the help page of either by, tapply, split.

Many thanks,

baptiste

On 10 Dec 2008, at 17:20, Chuck Cleland wrote:

> On 12/10/2008 12:02 PM, baptiste auguie 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.
>
> with(my.df, ave(y, group, FUN = function(x){x/max(x)}))
>
> ?ave
>
>> I'll appreciate any input,
>>
>> Baptiste
>> _____________________________
>>
>> Baptiste Auguié
>>
>> School of Physics
>> University of Exeter
>> 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
>> http://www.R-project.org/posting-guide.html
>> and provide commented, minimal, self-contained, reproducible code.
>
> --
> Chuck Cleland, Ph.D.
> NDRI, Inc. (www.ndri.org)
> 71 West 23rd Street, 8th floor
> New York, NY 10010
> tel: (212) 845-4495 (Tu, Th)
> tel: (732) 512-0171 (M, W, F)
> fax: (917) 438-0894
>

_____________________________

Baptiste Auguié

School of Physics
University of Exeter