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

时间:2015-04-17 03:43:40

标签: r time lag

我想延迟时间变量本身,格式改变,简单的例子:

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

为什么格式会发生变化?还有更好的建议吗?

3 个答案:

答案 0 :(得分:3)

您可以使用shift的开发版data.tablev.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

答案 1 :(得分:2)

您的日期正在被强制执行,因为NA未被识别为与POSIXct相同的班级。尝试:

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

答案 2 :(得分:0)

当我需要这样的延迟时,我经常使用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