我有一个关于根据时间因素创建滞后变量的问题。
基本上我正在使用棒球数据集,其中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
谢谢!
答案 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表示不会提醒你。