[R] Using apply to get group means
baptiste auguie
ba208 at exeter.ac.uk
Tue Mar 31 18:31:29 CEST 2009
Not exactly the output you asked for, but perhaps you can consider,
library(doBy)
> summaryBy(x3~x2+x1,data=x,FUN=mean)
> x2 x1 x3.mean
> 1 1 A 1.5
> 2 1 B 2.0
> 3 1 C 3.5
> 4 2 A 4.0
> 5 2 B 5.5
> 6 2 C 6.0
the plyr package also provides similar functionality, as do the ?by, ?
ave, and ?tapply base functions.
HTH,
baptiste
On 31 Mar 2009, at 17:09, Alan Cohen wrote:
> Hi all,
>
> I'm trying to improve my R skills and make my programming more
> efficient and succinct. I can solve the following question, but
> wonder if there's a better way to do it:
>
> I'm trying to calculate mean by several variables and then put this
> back into the original data set as a new variable. For example, if
> I were measuring weight, I might want to have each individual's
> weight, and also the group mean by, say, race, sex, and geographic
> region. The following code works:
>
>> x1<-rep(c("A","B","C"),3)
>> x2<-c(rep(1,3),rep(2,3),1,2,1)
>> x3<-c(1,2,3,4,5,6,2,6,4)
>> x<-as.data.frame(cbind(x1,x2,x3))
>> x3.mean<-rep(0,nrow(x))
>> for (i in 1:nrow(x)){
> + x3.mean[i]<-mean(as.numeric(x[,3][x[,1]==x[,1][i]&x[,2]==x[,2]
> [i]]))
> + }
>> cbind(x,x3.mean)
> x1 x2 x3 x3.mean
> 1 A 1 1 1.5
> 2 B 1 2 2.0
> 3 C 1 3 3.5
> 4 A 2 4 4.0
> 5 B 2 5 5.5
> 6 C 2 6 6.0
> 7 A 1 2 1.5
> 8 B 2 6 5.5
> 9 C 1 4 3.5
>
> However, I'd love to be able to do this with "apply" rather than a
> for-loop. Or is there a built-in function? Any suggestions?
>
> Also, any way to avoid the hassles with having to convert to a data
> frame and then again to numeric when one variable is character?
>
> Cheers,
> Alan Cohen
>
> ______________________________________________
> 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.
_____________________________
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
More information about the R-help
mailing list