Skip to content

"sequeeze" a data frame

5 messages · array chip, David Winsemius, Peter Alspach

#
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)

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

John
#
On Sep 9, 2010, at 5:47 PM, array chip wrote:

            
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".
David Winsemius, MD
West Hartford, CT
#
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:

            
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".
David Winsemius, MD
West Hartford, CT
#
Tena koe John

?aggregate

maybe?

HTH ....

Peter Alspach
The contents of this e-mail are confidential and may be subject to legal privilege.
 If you are not the intended recipient you must not use, disseminate, distribute or
 reproduce all or any part of this e-mail or attachments.  If you have received this
 e-mail in error, please notify the sender and delete all material pertaining to this
 e-mail.  Any opinion or views expressed in this e-mail are those of the individual
 sender and may not represent those of The New Zealand Institute for Plant and
 Food Research Limited.
#
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
The contents of this e-mail are confidential and may be ...{{dropped:17}}