我必须在R
中创建如下所示的前导和滞后变量假设我有一个数据框,其中包含客户访问任何商店的详细信息......
CustomerID Dateofvisit
1 1/2/2013
1 1/3/2013
1 1/7/2013
2 1/9/2013
2 1/14/2013
2 2/14/2013
3 1/4/2013
3 1/5/2013
正如我们所看到的,有3个客户有不同的访问日期..当我在上面应用滞后函数...(我创建了我自己的函数)时,它变成如下:
CustomerID Dateofvisit Laggeddate
1 1/2/2013 -
1 1/3/2013 1/2/2013
1 1/7/2013 1/3/2013
2 1/9/2013 1/7/2013
2 1/14/2013 1/9/2013
2 2/14/2013 1/14/2013
3 1/4/2013 2/14/2013
3 1/5/2013 1/4/2013
但是,我也希望落后于顾客。所以对于第4行,滞后日期应该是没有...类似于第3个cstomer,第一行/条目应该是notihng而在最后一行,我应该看到1/4/2013 ..我该怎么做?
以下是我用于lag / lead
的代码shift<-function(x,shift_by){
stopifnot(is.numeric(shift_by))
stopifnot(is.numeric(x))
if (length(shift_by)>1)
return(sapply(shift_by,shift, x=x))
out<-NULL
abs_shift_by=abs(shift_by)
if (shift_by > 0 )
out<-c(tail(x,-abs_shift_by),rep(NA,abs_shift_by))
else if (shift_by < 0 )
out<-c(rep(NA,abs_shift_by), head(x,-abs_shift_by))
else
out<-x
out
}
以及我如何领先/滞后:
#generate lead by 1 variable
test$df_lead2<-shift(test$x,1)
#generate lag by 1 variable
test$df_lag2<-shift(test$x,-1)
我想要的输出是:
CustomerID Dateofvisit Laggeddate
1 1/2/2013 -
1 1/3/2013 1/2/2013
1 1/7/2013 1/3/2013
2 1/9/2013 -
2 1/14/2013 1/9/2013
2 2/14/2013 1/14/2013
3 1/4/2013 -
3 1/5/2013 1/4/2013
答案 0 :(得分:1)
这是你想要的吗?
library(plyr)
ddply(.data = df, .variables = .(CustomerID), mutate,
lagdate = c(NA, head(Dateofvisit, -1)),
leaddate = c(tail(Dateofvisit, -1), NA))