【问题标题】:Create lead and lag variables in R在 R 中创建超前和滞后变量
【发布时间】:2013-08-31 10:51:58
【问题描述】:

我必须在 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 个客户,第一行/条目应该没有,在最后一行,我应该看到 2013 年 1 月 4 日.. 我该怎么做?

以下是我用于滞后/领先的代码

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

【问题讨论】:

  • 认为 我理解您在预期输出的文本中对滞后的描述,但您应该添加所需输出的示例(类似于您包含的失败尝试) 用于滞后和领先。

标签: r lead


【解决方案1】:

这是你想要的吗?

library(plyr)
ddply(.data = df, .variables = .(CustomerID), mutate,
   lagdate = c(NA, head(Dateofvisit, -1)),
   leaddate = c(tail(Dateofvisit, -1), NA))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-01
    • 2010-11-21
    • 1970-01-01
    相关资源
    最近更新 更多