1

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 番目の顧客の場合、最初の行/エントリは通知され、最後の行には 1/4/2013 が表示されます..これを行うにはどうすればよいですか?

以下は、ラグ/リードに使用するコードです

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
4

1 に答える 1

2

これは、あなたの望むことですか?

library(plyr)
ddply(.data = df, .variables = .(CustomerID), mutate,
   lagdate = c(NA, head(Dateofvisit, -1)),
   leaddate = c(tail(Dateofvisit, -1), NA))
于 2013-08-28T12:22:14.687 に答える