如何滞后时间变量并保持格式?

How to lag a time variable and keep the format?

我想滞后时间变量本身,格式改变,简单例子:

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

我想要的:

  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))

我得到的:

  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

为什么格式变了?有更好的建议吗?

当我需要这样的延迟时,我经常已经在使用dplyr,其中有一个lag功能可以满足您的需求:

mutate(dat, lagdt=lag(datetime))
##   number   datetime      dtlag      lagdt
## 1      1 2015-06-12 2015-06-12       <NA>
## 2      2 2015-06-13 2015-06-13 2015-06-12
## 3      3 2015-06-14 2015-06-14 2015-06-13
## 4      4 2015-06-15 2015-06-15 2015-06-14
## 5      5 2015-06-16 2015-06-16 2015-06-15

等价地,取决于您对 %>% 管道运算符 (ceci n'est pas un pipe) 的接受程度:

dat %>% mutate(dtlag=lag(datetime))
##   number   datetime      dtlag
## 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.table 的开发版本中的 shift,即 v.1.9.5。默认typelagn为1。安装devel版本的说明为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

我们也可以获得多个滞后

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

您的约会被强制执行,因为 NA 未被识别为与 POSIXct 相同的 class。尝试:

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