有没有简单的方法可以在没有变通方法的情况下(按组)延迟数据帧,如R中的数据表、xts、zoo、dplyr等



每当我想在数据帧中滞后时,我就会意识到本应简单的东西却不是。虽然问题已经被提出&回答了很多次(见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)

最新更新