Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 如何延迟时间变量并保持格式?_R_Time_Lag - Fatal编程技术网

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