为匹配因子创建滞后变量

时间:2013-05-22 21:05:16

标签: r variables loops lag creation

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

基本上我正在使用棒球数据集,其中2002 - 2012年间每个球员都有很多名字。显然,我只想让同一个人的滞后变量尝试创建职业弧来预测当前的统计数据。例如,我想使用lag 1 Average(2003),lag 2 Average(2004)来尝试预测2005年的当前平均值。所以我尝试编写一个遍历每一行的循环(数据框已经按照name,然后是year,所以前一年是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

谢谢!

3 个答案:

答案 0 :(得分:3)

沿着这些方向的Smth应该这样做:

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

答案 1 :(得分:0)

另一种方法是将数据拆分为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))

答案 2 :(得分: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表示不会提醒你。