【问题标题】:Creating lag variables for matched factors为匹配因子创建滞后变量
【发布时间】:2013-05-22 21:05:16
【问题描述】:

我有一个关于根据时间因素创建滞后变量的问题。

基本上,我正在使用棒球数据集,其中在 2002 年至 2012 年期间每个球员都有很多名字。显然,我只希望同一个人的滞后变量尝试创建职业弧线来预测当前统计数据。例如,我想使用 lag 1 Average (2003) , lag 2 Average (2004) 来尝试预测 2005 年的当前平均值。所以我尝试编写一个遍历每一行的循环(数据帧已经按name 然后是年份,所以上一年是 n-1 行),检查名称是否相同,如果是,则从上一行中获取值。

这是我的循环:

i=2 #as 1 errors out with 1-0 row
for(i in 2:6264){
if(TS$name[i]==TS$name[i-1]){
TS$runvalueL1[i]=TS$Run_Value[i-1]
}else{
TS$runvalueL1 <- NA
}
i=i+1
}

因为每一行都取决于名称,所以我不能使用大多数滞后函数。如果你有更好的主意,我会全力以赴!

示例数据无济于事,但这里有一些:

编辑:样本数据没有产生可用的结果,所以我只附加了我数据集的前 10 个人。谢谢!

TS[(6:10),c('name','Season','Run_Value')]
               name     Season    ARuns
321           Abad Andy   2003     -1.05
3158 Abercrombie Reggie   2006     27.42
1312 Abercrombie Reggie   2007      7.65
1069 Abercrombie Reggie   2008      5.34
4614    Abernathy Brent   2002     46.71
707     Abernathy Brent   2003     -2.29
1297    Abernathy Brent   2005      5.59
6024        Abreu Bobby   2002    102.89
6087        Abreu Bobby   2003    113.23
6177        Abreu Bobby   2004    128.60

谢谢!

【问题讨论】:

    标签: r variables loops lag creation


    【解决方案1】:

    应该按照这些思路去做:

    names = c("Adams","Adams","Adams","Adams","Bobby","Bobby", "Charlie")
    years = c(2002,2003,2004,2005,2004,2005,2010)
    Run_value = c(10,15,15,20,10,5,5)
    
    library(data.table)
    dt = data.table(names, years, Run_value)
    
    dt[, lag1 := c(NA, Run_value), by = names]
    #     names years Run_value lag1
    #1:   Adams  2002        10   NA
    #2:   Adams  2003        15   10
    #3:   Adams  2004        15   15
    #4:   Adams  2005        20   15
    #5:   Bobby  2004        10   NA
    #6:   Bobby  2005         5   10
    #7: Charlie  2010         5   NA
    

    【讨论】:

    • 我喜欢这个想法,但它不适用于我正在使用的实际数据,因此我将前 10 个实际数据条目与所使用的列一起附加。(将为许多列创建滞后变量,但那是一旦一个工作很容易改变)
    • 我只是得到了错误。我可以只使用大型数据集而不是 dt,因为它的格式很好,所以:TS[, lag1 := c(NA, TS$Run_Value), by = TS$name] 我得到这个错误:[57] ERROR: =` (lag1, c(NA, TS$Run_Value)), by = TS$name)
    • @BaseballR 你需要一个data.table 来运行上面的代码,所以首先转换你的TS,例如通过运行dt = data.table(TS)
    • 你太棒了!我觉得我试过了,但可惜我猜不是!下一个问题,如果我想获得第二个延迟(-2 年),我该怎么做?
    • 另外,我如何访问所有数据?在我这样做之后,我想使用函数 dt[(1:10),c('name','Season','Run_Value','lag1')] 查看前 10 行数据,但它不允许我。如何将其从数据框中取出或在其中进行操作?
    【解决方案2】:

    另一种方法是按name 拆分数据,将lapply 与您选择的滞后函数一起使用,然后再次合并拆分后的数据:

    TS$runvalueL1 <- do.call("rbind", lapply(split(TS, list(TS$name)), your_lag_function))
    

    TS$runvalueL1 <- do.call("c", lapply(split(TS, list(TS$name)), your_lag_function))
    

    但我想plyr 也有很好的可能性,但由于您没有提供reproducible example,所以这只是开始。

    更好:

    TS$runvalueL1 <- unlist(lapply(split(TS, list(TS$name)), your_lag_function))
    

    【讨论】:

      【解决方案3】:

      这显然不是你想用cbind创建矩阵的问题,所以这是一个更好的数据结构:

      full=data.frame(names, years, Run_value)
      

      ave 函数对于在其他列的类别中构造新列非常有用:

      full$Lag1 <- ave(full$Run_value, full$names, 
                FUN= function(x) c(NA, x[-length(x)] )  )
      full
          names years Run_value Lag1
      1   Adams  2002        10   NA
      2   Adams  2003        15   10
      3   Adams  2004        15   15
      4   Adams  2005        20   15
      5   Bobby  2004        10   NA
      6   Bobby  2005         5   10
      7 Charlie  2010         5   NA
      

      我认为使用 NA 进行 cionstruct 更安全,因为这将有助于防止在第 1 年使用前几年的 0 不会提醒您的逻辑错误。

      【讨论】:

      • 我喜欢这个想法,但它不适用于我正在使用的实际数据,因此我将前 10 个实际数据条目与所使用的列一起附加。(将为许多列创建滞后变量,但那是一旦一个工作很容易改变)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-11-01
      • 1970-01-01
      • 2018-07-04
      • 1970-01-01
      • 2019-08-18
      • 2013-08-31
      • 1970-01-01
      相关资源
      最近更新 更多