0

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

基本上我正在使用一个棒球数据集,其中在 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

谢谢!

4

3 回答 3

3

沿着这些思路应该这样做:

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
于 2013-05-22T21:15:57.940 回答
0

这显然不是您想要创建矩阵的问题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 不会提醒您的逻辑错误。

于 2013-05-22T21:19:02.997 回答
0

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

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,但是由于您没有提供可重现的示例,所以这只是开始。

更好的:

TS$runvalueL1 <- unlist(lapply(split(TS, list(TS$name)), your_lag_function))
于 2013-05-22T21:14:02.170 回答