我想延迟时间变量本身,格式改变,简单的例子:
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
为什么格式会发生变化?还有更好的建议吗?
答案 0 :(得分:3)
您可以使用shift
的开发版data.table
,v.1.9.5
。默认type
为lag
,n
为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