Thank you Dennis--this is perfect!! AC
On Thu, Jan 28, 2010 at 12:24 AM, Dennis Murphy <djmu...@gmail.com> wrote: > Hi: > There are several ways to do this, but these are the most commonly used: > aggregate() and the ddply() function in package plyr. > > (1) plyr solution (using x as the name of your input data frame): > > library(plyr) > > ddply(x, .(id, mod1), summarize, es = mean(es)) > id mod1 es > 1 1 2 0.30 > 2 2 4 0.15 > 3 3 1 0.20 > > ddply(x, .(id, mod1, mod2), summarize, es = mean(es)) > id mod1 mod2 es > 1 1 2 wai 0.30 > 2 2 4 calpas 0.20 > 3 2 4 other 0.10 > 4 3 1 itas 0.10 > 5 3 1 wai 0.25 > > (2) aggregate() function in base R: > > > with(x, aggregate(list(es = es), by = list(id = id, mod1 = mod1), mean)) > id mod1 es > 1 3 1 0.20 > 2 1 2 0.30 > 3 2 4 0.15 > > with(x, aggregate(list(es = es), by = list(id = id, mod1 = mod1, mod2 = > mod2), > + mean)) > id mod1 mod2 es > 1 2 4 calpas 0.20 > 2 3 1 itas 0.10 > 3 2 4 other 0.10 > 4 3 1 wai 0.25 > 5 1 2 wai 0.30 > > Note that enclosing the variable names in lists and 'equating' them > maintains > the variable name in the output. Here's what happens if you don't: > > > with(x, aggregate(es, list(id, mod1), mean)) > Group.1 Group.2 x > 1 3 1 0.20 > 2 1 2 0.30 > 3 2 4 0.15 > > ddply() is a little less painless and sorts the output for you > automatically. > > HTH, > Dennis > > On Wed, Jan 27, 2010 at 7:34 PM, AC Del Re <acde...@gmail.com> wrote: > >> Hi All, >> >> I'm conducting a meta-analysis and have taken a data.frame with multiple >> rows per >> study (for each effect size) and performed a weighted average of effect >> size >> for >> each study. This results in a reduced # of rows. I am particularly >> interested in >> simply reducing the additional variables in the data.frame to the first >> row >> of the >> corresponding id variable. For example: >> >> id<-c(1,2,2,3,3,3) >> es<-c(.3,.1,.3,.1,.2,.3) >> mod1<-c(2,4,4,1,1,1) >> mod2<-c("wai","other","calpas","wai","itas","other") >> data<-as.data.frame(cbind(id,es,mod1,mod2)) >> >> data >> >> id es mod1 mod2 >> 1 1 0.3 2 wai >> 2 2 0.1 4 other >> 3 2 0.2 4 calpas >> 4 3 0.1 1 itas >> 5 3 0.2 1 wai >> 6 3 0.3 1 wai >> >> # I would like to reduce the entire data.frame like this: >> >> id es mod1 mod2 >> >> 1 .30 2 wai >> 2 .15 4 other >> 3 .20 1 itas >> >> # If possible, I would also like the option of this (collapsing on id and >> mod2): >> >> id es mod1 mod2 >> 1 .30 2 wai >> 2 0.1 4 other >> 2 0.2 4 calpas >> 3 0.1 1 itas >> 3 0.25 1 wai >> >> Any help is much appreciated! >> >> AC Del Re >> >> [[alternative HTML version deleted]] >> >> ______________________________________________ >> R-help@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. >> > > [[alternative HTML version deleted]] ______________________________________________ R-help@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.