[R] "sequeeze" a data frame

array chip arrayprofile at yahoo.com
Fri Sep 10 01:34:45 CEST 2010


Thank you Peter, yes this is what I need!

John



----- Original Message ----
From: Peter Alspach <Peter.Alspach at plantandfood.co.nz>
To: array chip <arrayprofile at yahoo.com>; David Winsemius 
<dwinsemius at comcast.net>
Cc: "r-help at r-project.org" <r-help at r-project.org>
Sent: Thu, September 9, 2010 4:26:53 PM
Subject: RE: [R] "sequeeze" a data frame

Tena koe John

?aggregate

maybe?

HTH ....

Peter Alspach

> -----Original Message-----
> From: r-help-bounces at r-project.org [mailto:r-help-bounces at r-
> project.org] On Behalf Of array chip
> Sent: Friday, 10 September 2010 11:13 a.m.
> To: David Winsemius
> Cc: r-help at r-project.org
> Subject: Re: [R] "sequeeze" a data frame
> 
> Thank you David. I probably didn't make my question clear enough. In
> the end, I
> want a "shorter" version of the original data frame, basically with
> variable
> "rep" removed, then just one row per id, time and mode combination. The
> original
> data frame has 54 rows, I wish to have a data frame with only 27 rows
> after
> average.
> 
> Using ave() would produce the following 3 rows for example:
>       id    time    mode   rep            y                 avg.y
> 1     1      0          R      1    -1.089540576    -0.21924078
> 19   1      0          R      2     -0.743374679   -0.21924078
> 37   1      0          R      3      1.175192908   -0.21924078
> 
> But I only need one row:
> 
>      id      time      mode            avg.y
> 1    1        0           R        -0.21924078
> 
> Thanks again,
> 
> John
> 
> 
> 
> ----- Original Message ----
> From: David Winsemius <dwinsemius at comcast.net>
> To: array chip <arrayprofile at yahoo.com>
> Cc: r-help at r-project.org
> Sent: Thu, September 9, 2010 3:21:15 PM
> Subject: Re: [R] "sequeeze" a data frame
> 
> 
> On Sep 9, 2010, at 5:47 PM, array chip wrote:
> 
> > Hi, suppose I have a data frame as below:
> >
> >dat<-
> cbind(expand.grid(id=c(1,2,3),time=c(0,3,6),mode=c('R','L'),rep=(1:3)),
> y=rnorm(54))
> >)
> >
> >
> > I kind of want to "squeeze" the data frame into a new one with
> averaged "y"
> >over
> > "rep" for the same id, time and mode. taking average is easy with
> tapply:
> >
> > tapply(dat$y, list(dat$id, dat$time, dat$mode), mean)
> 
> Try:
> 
> dat$avg.y <- ave(dat$y, dat$id, dat$time, dat$mode, FUN=mean)
> 
> ?ave
> 
> The syntax of ave is different than "tapply" or "by". The grouping
> factors are
> not presented as a list and the FUN argument comes after the ,..., so
> it needs
> to be named if different than the default of "mean".
> 
> >
> > But I want the result to be in the same format as "dat". Certainly,
> we always
> > can transform the result (array) into the data frame using a lot of
> codes. But
> > is there a simple way to do this?
> >
> > Thanks
> 
> David Winsemius, MD
> West Hartford, CT
> 
> ______________________________________________
> 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.

The contents of this e-mail are confidential and may be ...{{dropped:17}}



More information about the R-help mailing list