HI GG, Try this: dat2<- fun1(dat.bru) res1<-aggregate(basdai_d~patient_id+evnmt_brutal,data=dat2,mean) res11<-res1[order(res1$patient_id),] row.names(res11)<- 1:nrow(res11) head(res11,10) # patient_id evnmt_brutal basdai_d #1 2 0 0.9000000 #2 2 1 -0.8000000 #3 3 0 -0.7083333 #4 3 1 0.5750000 #5 5 0 0.0000000 #6 5 1 -1.2000000 #7 6 0 0.7750000 #8 6 1 -0.4250000 #9 7 0 -1.7250000 #10 7 1 0.8250000
#or library(plyr) res2<-ddply(dat2,.(patient_id,evnmt_brutal),summarize,basdai_d=mean(basdai_d)) identical(res11,res2) #[1] TRUE A.K. ________________________________ From: GUANGUAN LUO <guanguan...@gmail.com> To: arun <smartpink...@yahoo.com> Sent: Tuesday, May 28, 2013 4:53 AM Subject: Re: choose the lines Thanks a lot, Arun, you are soooooo great!!! If i want to get the mean when evnmt_brutal==0 and evnmt_brutal==1 for each patient, what can i do for that? GG 2013/5/27 arun <smartpink...@yahoo.com> > >Hi, >Try this: >dat1<- read.csv("dat7.csv",header=TRUE,stringsAsFactors=FALSE,sep="\t") >dat.bru<- dat1[!is.na(dat1$evnmt_brutal),] > >fun1<- function(dat){ > lst1<- split(dat,dat$patient_id) > lst2<- lapply(lst1,function(x) x[cumsum(x$evnmt_brutal==0)>0,]) > lst3<- lapply(lst2,function(x) >x[!(all(x$evnmt_brutal==1)|all(x$evnmt_brutal==0)),]) > lst4<-lapply(lst3,function(x) {vect.brutal=c() > for(line in which(x$evnmt_brutal==1)){ > if(x$evnmt_brutal[line-1]==0){ > vect.brutal=c(vect.brutal,line) > } > } > vect.brutal1<- sort(c(vect.brutal,vect.brutal-1)) > x[vect.brutal1,] > } > ) > res<- do.call(rbind,lst4) > row.names(res)<- 1:nrow(res) > res > } > > >fun1(dat.bru)head(fun1(dat.bru),10) ># X patient_id number responsed_at t basdai_d evnmt_brutal >#1 14 2 13 2011-08-07 13 0.900 0 >#2 15 2 14 2011-09-11 14 -0.800 1 >#3 22 3 2 2010-06-29 1 -0.800 0 >#4 23 3 3 2010-08-05 2 0.000 1 >#5 24 3 4 2010-09-05 3 1.200 0 >#6 25 3 5 2010-10-13 4 1.925 1 >#7 26 3 6 2010-11-15 5 -2.525 0 >#8 27 3 7 2010-12-18 6 -0.200 1 >#9 53 5 9 2011-02-13 8 0.000 0 >#10 54 5 10 2011-03-19 9 -1.200 1 > > >A.K. > >_______________________________ >From: GUANGUAN LUO <guanguan...@gmail.com> >To: arun <smartpink...@yahoo.com> >Sent: Monday, May 27, 2013 8:48 AM >Subject: choose the lines > > > > >Hello, Arun, > >in this data, i want to choose every line with the variable " evnmt_brutal"==1 >& the precedent line( line-1) with "evnmt_brutal"==0, >i had done this, > >res.bru <- dat7[!is.na(dat7$evnmt_brutal),] >vect.brutal=c() >for(line in which(res.bru$evnmt_brutal==1)){ > if(res.r$evnmt_brutal[line-1]==0){ > vect.brutal=c(vect.brutal,line)} >} >vect.brutal > >but now i think it's not correct. Because if there are the situations just >like this >Patient_id evnmt_brutal >1 ... >1 ... >1 0 >2 1 >2 ... >2 ... > >I would have chosen the lines of two different patients, so that is not >correct. >Do you know how can i change a little and get the correct lines just for each >patient? > >Thank you so much. > >GG > ______________________________________________ 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.