Try this:

merge(dat, factor(with(dat[!dat$time,], tapply(y, id,
function(x)ifelse(all(mean(x) == x), 1, which.max(x)))), labels = c('right',
'left')), by.x = 'id', by.y = 0)

On Fri, Oct 1, 2010 at 3:15 PM, array chip <arrayprofile@yahoo.com> wrote:

> Thank you Phil. The only problem with the code is when the 2 y values are
> equal,
> it should default to "right". Your code would default to the first maximum.
> But
> it's ok, I see the logic here and can figure it out. I wondered whether
> there is
> some one-line thing that can do this, I guess not possible.
>
> Thank you
>
> John
>
>
>
>
> ________________________________
> From: Phil Spector <spector@stat.berkeley.edu>
>
> Cc: r-help@r-project.org
> Sent: Fri, October 1, 2010 10:58:55 AM
> Subject: Re: [R] add a new column to data frame
>
> Here are two ways:
>
> dat0 = subset(dat,time==0)
>
> one = as.data.frame(as.table(by(dat0,dat0$id,
>                     function(x)as.character(x$mode)[which.max(x$y)])))
> names(one) = c('id','type')
> merge(dat,one)
>
> two = sapply(split(dat0,dat0$id),
>              function(x)as.character(x$mode)[which.max(x$y)])
> merge(dat,data.frame(id=names(two),type=two))
>
>
>                    - Phil Spector
>                     Statistical Computing Facility
>                     Department of Statistics
>                     UC Berkeley
>                    spector@stat.berkeley.edu
>
>
>
>
> On Fri, 1 Oct 2010, array chip wrote:
>
> > Hi, I am wondering if anyone can propose a simple/best way to do the
> following:
> >
> > Let's say I have a data frame
> >
> > dat <-
>
> >cbind(expand.grid(mode=c('right','left'),time=0:3,id=c('p1','p2','p3')),y=c(3,5,rep(4,6),6,2,rep(3,6),4,4,rep(2,6)))
> >)
> >
> >
> > dat
> >    mode time id y
> > 1  right    0 p1 3
> > 2   left    0 p1 5
> > 3  right    1 p1 4
> > 4   left    1 p1 4
> > 5  right    2 p1 4
> > 6   left    2 p1 4
> > 7  right    0 p2 6
> > 8   left    0 p2 2
> > 9  right    1 p2 3
> > 10  left    1 p2 3
> > 11 right    2 p2 3
> > 12  left    2 p2 3
> > 13 right    0 p3 4
> > 14  left    0 p3 4
> > 15 right    1 p3 2
> > 16  left    1 p3 2
> > 17 right    2 p3 2
> > 18  left    2 p3 2
> >
> > Now I want to add a new column "type" to this data frame with values of
> either
> > "left" or "right" for each "id" based on the following logic:
> >
> > For each "id", the value of "type" column is the value of "mode" for
> which the
> > value of "y" is the maximum of "y" based on time=0. For example for
> id=p1, the
> > value of "type" is "left" because for the 2 "y" values (3 & 5) based on
> time=0,
> > mode=left has the bigger "y" value (5). But if the 2 "y" values are the
> same
> >for
> > "mode", then let type=right.
> >
> > In the end the new data frame is:
> >
> >    mode time id y  type
> > 1  right    0 p1 3  left
> > 2   left    0 p1 5  left
> > 3  right    1 p1 4  left
> > 4   left    1 p1 4  left
> > 5  right    2 p1 4  left
> > 6   left    2 p1 4  left
> > 7  right    0 p2 6 right
> > 8   left    0 p2 2 right
> > 9  right    1 p2 3 right
> > 10  left    1 p2 3 right
> > 11 right    2 p2 3 right
> > 12  left    2 p2 3 right
> > 13 right    0 p3 4 right
> > 14  left    0 p3 4 right
> > 15 right    1 p3 2 right
> > 16  left    1 p3 2 right
> > 17 right    2 p3 2 right
> > 18  left    2 p3 2 right
> >
> > Any suggestions would be appreciated.
> >
> > John
> >
> >
> >
> >     [[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.
>



-- 
Henrique Dallazuanna
Curitiba-Paraná-Brasil
25° 25' 40" S 49° 16' 22" O

	[[alternative HTML version deleted]]

