Search code examples
rtimelag

How to lag a time variable and keep the format?


I want to lag the time variable itself, the format changes, simple example:

data<-data.frame(number=seq(1:5), 
      datetime=seq(as.POSIXct("2015/06/12"),as.POSIXct("2015/06/16"),by="1 day"))

   number   datetime
1      1 2015-06-12
2      2 2015-06-13
3      3 2015-06-14
4      4 2015-06-15
5      5 2015-06-16

What I want:

  number   datetime datetime.lag
1      1 2015-06-12           NA
2      2 2015-06-13   2015-06-12
3      3 2015-06-14   2015-06-13
4      4 2015-06-15   2015-06-14
5      5 2015-06-16   2015-06-15


data$datetime.lag<-c(NA, head(data$datetime, -1))

What I get:

  number   datetime datetime.lag
1      1 2015-06-12           NA
2      2 2015-06-13   1434092400
3      3 2015-06-14   1434178800
4      4 2015-06-15   1434265200
5      5 2015-06-16   1434351600

Why the format changes? any better suggestion?


Solution

  • You could use shift from the devel version of data.table i.e. v.1.9.5. The default type is lag and n is 1. Instructions to install the devel version are here

    library(data.table)
    setDT(data)[, lagdt:= shift(datetime)][]
    #    number   datetime      lagdt
    #1:      1 2015-06-12       <NA>
    #2:      2 2015-06-13 2015-06-12
    #3:      3 2015-06-14 2015-06-13
    #4:      4 2015-06-15 2015-06-14
    #5:      5 2015-06-16 2015-06-15
    

    We can also get multiple lags

    setDT(data)[, paste0('lagDT', 1:2) :=shift(datetime, 1:2)][]
    #    number   datetime     lagDT1     lagDT2
    #1:      1 2015-06-12       <NA>       <NA>
    #2:      2 2015-06-13 2015-06-12       <NA>
    #3:      3 2015-06-14 2015-06-13 2015-06-12
    #4:      4 2015-06-15 2015-06-14 2015-06-13
    #5:      5 2015-06-16 2015-06-15 2015-06-14