Hi, Try this: library(mondate) mutate(evt_c.1,t=ave(round(as.numeric(mondate(paste(evt_c.1[,2],"-01",sep="")))),patient_id,FUN=function(x) c(0,cumsum(diff(x))))) # patient_id responsed_at t #1 1 2010-5 0 #2 1 2010-7 2 #3 1 2010-8 3 #4 1 2010-9 4 #5 1 2010-12 7 #6 1 2011-1 8 #7 1 2011-2 9 #8 2 2010-5 0 #9 2 2010-6 1 #10 2 2010-7 2 #11 3 2010-1 0 #12 3 2010-2 1 #13 3 2010-4 3 #14 3 2010-5 4 #15 4 2011-01 0 #16 4 2011-03 2 #17 5 2012-04 0 #18 5 2012-06 2 If it change: evt_c.1$responsed_at[6:7]<- c("2011-05","2011-07") mutate(evt_c.1,t=ave(round(as.numeric(mondate(paste(evt_c.1[,2],"-01",sep="")))),patient_id,FUN=function(x) c(0,cumsum(diff(x))))) # patient_id responsed_at t #1 1 2010-5 0 #2 1 2010-7 2 #3 1 2010-8 3 #4 1 2010-9 4 #5 1 2010-12 7 #6 1 2011-05 12 #7 1 2011-07 14 #8 2 2010-5 0 #9 2 2010-6 1 #10 2 2010-7 2 #11 3 2010-1 0 #12 3 2010-2 1 #13 3 2010-4 3 #14 3 2010-5 4 #15 4 2011-01 0 #16 4 2011-03 2 #17 5 2012-04 0 #18 5 2012-06 2
A.K. ________________________________ From: GUANGUAN LUO <guanguan...@gmail.com> To: arun <smartpink...@yahoo.com> Sent: Wednesday, April 17, 2013 9:25 AM Subject: Re: how to change the date into an interval of date? mutate(evt_c.11,t=ave(as.numeric(gsub(".*\\-","",responsed_at)),patient_id,FUN=function(x) c(0,cumsum(diff(x))))) patient_id responsed_at t 1 1 2010-5 0 2 1 2010-7 2 3 1 2010-8 3 4 1 2010-9 4 5 1 2010-12 7 6 1 2011-1 8 7 1 2011-2 9 8 2 2010-5 0 9 2 2010-6 1 10 2 2010-7 2 11 3 2010-1 0 12 3 2010-2 1 13 3 2010-4 3 14 3 2010-5 4 15 4 2011-01 0 16 4 2011-03 2 17 5 2012-04 0 18 5 2012-06 2 this is the order i want. you are so kind-hearted. GG 2013/4/17 arun <smartpink...@yahoo.com> Alright, Sorry, I misunderstood. So, what do you want your result to be at "2011-1". Is it 0? > > > > > > >________________________________ > From: GUANGUAN LUO <guanguan...@gmail.com> >To: arun <smartpink...@yahoo.com> >Sent: Wednesday, April 17, 2013 9:21 AM > >Subject: Re: how to change the date into an interval of date? > > > >evt_c.1<- read.table(text=" >patient_id responsed_at >1 2010-5 >1 2010-7 >1 2010-8 >1 2010-9 >1 2010-12 >1 2011-1 >1 2011-2 >2 2010-5 >2 2010-6 >2 2010-7 >3 2010-1 >3 2010-2 >3 2010-4 >3 2010-5 >4 2011-01 >4 2011-03 >5 2012-04 >5 2012-06 >",sep="",header=TRUE, >stringsAsFactors=FALSE) > >mutate(evt_c.11,t=ave(as.numeric(gsub(".*\\-","",responsed_at)),patient_id,FUN=function(x) > c(0,cumsum(diff(x))))) patient_id responsed_at t 1 1 2010-5 0 2 1 2010-7 2 3 1 2010-8 3 4 1 2010-9 4 5 1 2010-12 7 6 1 2011-1 -4 7 1 2011-2 -3 8 2 2010-5 0 9 2 2010-6 1 10 2 2010-7 2 11 3 2010-1 0 12 3 2010-2 1 13 3 2010-4 3 14 3 2010-5 4 15 4 2011-01 0 16 4 2011-03 2 17 5 2012-04 0 18 5 2012-06 2 > > >This is my problem. > > > > >2013/4/17 arun <smartpink...@yahoo.com> > >If this is not what your problem, please provide a dataset like below and >explain where is the problem? >> >> >> >> >> >>----- Original Message ----- >>From: arun <smartpink...@yahoo.com> >>To: GUANGUAN LUO <guanguan...@gmail.com> >>Cc: >>Sent: Wednesday, April 17, 2013 9:17 AM >>Subject: Re: how to change the date into an interval of date? >> >>Hi, >>I am not sure I understand your question: >>evt_c.1<- read.table(text=" >>patient_id responsed_at >>1 2010-5 >>1 2010-7 >>1 2010-8 >>1 2010-9 >>2 2010-5 >>2 2010-6 >>2 2010-7 >>3 2010-1 >>3 2010-2 >>3 2010-4 >>3 2010-5 >>4 2011-01 >>4 2011-03 >>5 2012-04 >>5 2012-06 >>",sep="",header=TRUE,stringsAsFactors=FALSE) >> >>mutate(evt_c.1,t=ave(as.numeric(gsub(".*\\-","",responsed_at)),patient_id,FUN=function(x) >> c(0,cumsum(diff(x))))) >> patient_id responsed_at t >>1 1 2010-5 0 >>2 1 2010-7 2 >>3 1 2010-8 3 >>4 1 2010-9 4 >>5 2 2010-5 0 >>6 2 2010-6 1 >>7 2 2010-7 2 >>8 3 2010-1 0 >>9 3 2010-2 1 >>10 3 2010-4 3 >>11 3 2010-5 4 >>12 4 2011-01 0 >>13 4 2011-03 2 >>14 5 2012-04 0 >>15 5 2012-06 2 >>A.K. >> >> >> >>________________________________ >>From: GUANGUAN LUO <guanguan...@gmail.com> >>To: arun <smartpink...@yahoo.com> >>Sent: Wednesday, April 17, 2013 9:11 AM >>Subject: Re: how to change the date into an interval of date? >> >> >> >>but the date is untill 2012, if you do like this, t of 2011-01 would be -4. >> >> >>2013/4/17 GUANGUAN LUO <guanguan...@gmail.com> >> >>but the date is untill 2012, if you do like this, t of 2011-01 would be -1. >>> >>> >>> >>>2013/4/17 arun <smartpink...@yahoo.com> >>> >>>Hi, >>>>Try: >>>>evt_c.1<- read.table(text=" >>>> >>>>patient_id responsed_at >>>>1 2010-5 >>>>1 2010-7 >>>>1 2010-8 >>>>1 2010-9 >>>>2 2010-5 >>>>2 2010-6 >>>>2 2010-7 >>>>",sep="",header=TRUE,stringsAsFactors=FALSE) >>>>lst1<-split(evt_c.1,evt_c.1$patient_id) >>>> res<-do.call(rbind,lapply(lst1,function(x) >>>>{x1<-as.numeric(gsub(".*\\-","",x[,2])); x$t<-c(0,cumsum(diff(x1)));x})) >>>> row.names(res)<-1:nrow(res) >>>> res >>>># patient_id responsed_at t >>>>#1 1 2010-5 0 >>>>#2 1 2010-7 2 >>>>#3 1 2010-8 3 >>>>#4 1 2010-9 4 >>>>#5 2 2010-5 0 >>>>#6 2 2010-6 1 >>>>#7 2 2010-7 2 >>>> >>>>#or >>>>library(plyr) >>>>res2<-mutate(evt_c.1,t=ave(as.numeric(gsub(".*\\-","",responsed_at)),patient_id,FUN=function(x) >>>> c(0,cumsum(diff(x))))) >>>>res2 >>>># patient_id responsed_at t >>>>#1 1 2010-5 0 >>>>#2 1 2010-7 2 >>>>#3 1 2010-8 3 >>>>#4 1 2010-9 4 >>>>#5 2 2010-5 0 >>>>#6 2 2010-6 1 >>>>#7 2 2010-7 2 >>>> identical(res,res2) >>>>#[1] TRUE >>>> >>>> >>>>A.K. >>>> >>>> >>>>________________________________ >>>> From: GUANGUAN LUO <guanguan...@gmail.com> >>>>To: arun <smartpink...@yahoo.com> >>>>Sent: Wednesday, April 17, 2013 8:32 AM >>>> >>>>Subject: Re: how to change the date into an interval of date? >>>> >>>> >>>> >>>> >>>>thank you, and now i've got a table like this >>>>> dput(head(evt_c.1,5)) structure(list(responsed_at = c("2010-05", >>>>> "2010-07", "2010-08", >>>>"2010-10", "2010-11"), patient_id = c(2L, 2L, 2L, 2L, 2L), number = c(1, >>>>2, 3, 4, 5), response_id = c(77L, 1258L, 2743L, 4499L, 6224L), session_id >>>>= c(2L, 61L, 307L, 562L, 809L), login = c(3002, 3002, 3002, 3002, 3002), >>>>clinique_basdai.fatigue = c(4, 5, 5, 6, 4), >>>> >>>>which i want is to add a column "t", for example >>>>now my table is like this: >>>>patient_id responsed_at >>>>1 2010-5 >>>>1 2010-7 >>>>1 2010-8 >>>>1 2010-9 >>>>2 2010-5 >>>>2 2010-6 >>>>2 2010-7 >>>> >>>>after add the column "t" >>>> >>>>paient_id responsed_at t >>>>1 2010-5 0 >>>>1 2010-7 2 >>>>1 2010-8 3 >>>>1 2010-9 4 >>>>2 2010-5 0 >>>>2 2010-6 1 >>>>2 2010-7 2 >>>> >>>> >>>> >>>> >>>>Le 17 avril 2013 14:23, arun <smartpink...@yahoo.com> a écrit : >>>> >>>>Hi, >>>>>format() is one way. >>>>>library(zoo) >>>>> as.yearmon(dat1$responsed_at) >>>> >>>>>#[1] "May 2010" "Jul 2010" "Aug 2010" "Oct 2010" "Nov 2010" "Dec 2010" >>>>> #[7] "Jan 2011" "Feb 2011" "Mar 2011" "Apr 2011" "Jun 2011" "Jul 2011" >>>>>#[13] "Aug 2011" "Sep 2011" "Oct 2011" "Nov 2011" "Dec 2011" "Jan 2012" >>>>>#[19] "Mar 2012" "May 2010" >>>>>A.K. >>>>> >>>>> >>>>> >>>>> >>>> >>>> >>> >> >> > > > ______________________________________________ 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.