R 如何延迟时间变量并保持格式?
我想延迟时间变量本身,格式更改,简单示例:R 如何延迟时间变量并保持格式?,r,time,lag,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
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
为什么格式会改变?有更好的建议吗?当我需要这样的延迟时,我经常已经在使用
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
您可以使用
data.table的devel版本中的shift
,即v.1.9.5
。默认的type
为lag
,n
为1。安装devel版本的说明如下
库(data.table)
setDT(数据)[,lagdt:=shift(日期时间)][]
#日期时间滞后数
#1: 1 2015-06-12
#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
setDT(data)[,paste0('lagDT',1:2):=shift(datetime,1:2)][]
#数字日期时间滞后1滞后2
#1: 1 2015-06-12
#2: 2 2015-06-13 2015-06-12
#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
不属于同一类别。尝试:
data$datetime.lag <- c(as.POSIXct(NA), head(data$datetime, -1))
data$datetime.lag
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
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
data$datetime.lag <- c(as.POSIXct(NA), head(data$datetime, -1))