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 <arrayprof...@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 <spec...@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 > spec...@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]]
______________________________________________ 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.