每当我想在数据帧中滞后时,我就会意识到本应简单的东西却不是。虽然问题已经被提出&回答了很多次(见p.s.),我没有找到一个简单的解决方案,直到下次我落后时我才能记住。一般来说,在R中,滞后似乎不是一件简单的事情,正如多个变通方法所证明的那样。我经常遇到这个问题,如果有一些基本R解决方案,不需要额外的包,那将非常有帮助。你能为滞后提供一个简单的解决方案吗?
如果这不可能,你至少可以在这里提供你的解决方案,这样我们就可以在第二好的替代方案中进行选择吗?此处已存在一个集合
此外,在所有关于这个主题的博客文章中,我看到人们抱怨滞后是多么出乎意料的困难,那么我们如何将数据帧的简单滞后函数输入R Core?对于来自Stata或EViews的任何人来说,这一定非常令人失望。或者我遗漏了什么,而有一个简单的内置解决方案?
假设我们希望每个"国家"的"价值"滞后3年:
Data <- data.frame(year=c(rep(2010:2015,2)),country=c(rep("AT",6),rep("DE",6)),value=rnorm(12))
创建类似L3的:
year country value L3
2010 AT 0.3407 NA
2011 AT -1.7981 NA
2012 AT -0.8390 NA
2013 AT -0.6888 0.3407
2014 AT -1.1019 -1.7981
2015 AT -0.8953 -0.8390
2010 DE 0.5877 NA
2011 DE -1.0204 NA
2012 DE -0.6576 NA
2013 DE 0.6620 0.5877
2014 DE 0.9579 -1.0204
2015 DE -0.7774 -0.6576
我们既不想改变数据的性质(到ts或数据表),也不想在截止日期今晚到来时沉浸在三个新的包中,我们的主管使用Stata,认为滞后很容易;-)(不是,我只是想做好准备…)
p.s.:
无组
with data.table:数据帧中的滞后或如何在每个组中创建滞后变量?
时间序列是直接的
如果问题是如何在不使用包的情况下提供具有前三年价值的列,请尝试以下操作:
prior_year3 <- function(x, k = 3) head(c(rep(NA, k), x), length(x))
transform(Data, prior_year_value = ave(value, country, FUN = prior_year3))
给予:
year country value prior_year_value
1 2010 AT -1.66562121 NA
2 2011 AT -0.04950063 NA
3 2012 AT 1.55930293 NA
4 2013 AT -0.40462394 -1.66562121
5 2014 AT 0.78602610 -0.04950063
6 2015 AT 0.73912916 1.55930293
7 2010 DE 1.03710539 NA
8 2011 DE -1.13370942 NA
9 2012 DE -1.20530981 NA
10 2013 DE 1.66870572 1.03710539
11 2014 DE 1.53615793 -1.13370942
12 2015 DE -0.09693335 -1.20530981
也就是说,要有效地使用R,你确实需要学习如何使用关键包。
尝试数据组合包中的幻灯片,它很简单slide(Data,Var='value',GroupVar = 'country',slideBy=-3)