如何滞后时间变量并保持格式?
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
。默认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
您的约会被强制执行,因为 NA
未被识别为与 POSIXct
相同的 class。尝试:
data$datetime.lag <- c(as.POSIXct(NA), head(data$datetime, -1))
我想滞后时间变量本身,格式改变,简单例子:
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
。默认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
您的约会被强制执行,因为 NA
未被识别为与 POSIXct
相同的 class。尝试:
data$datetime.lag <- c(as.POSIXct(NA), head(data$datetime, -1))