是否有简单的方法可以在数据框中(按组)滞后,而无需 R 中的数据表、xts、zoo、dplyr 等变通方法?

Are there simple ways to lag (by group) in data frames without workarounds like data tables, xts, zoo, dplyr etc in R?

每当我想在数据框中滞后时,我就会意识到本应简单的东西却并非如此。虽然这个问题已被多次询问和回答(参见 p.s.),但我没有找到一个简单的解决方案,直到下次我滞后时我才能记住。一般来说,在 R 中,滞后似乎不是一件简单的事情,因为有多种解决方法可以证明。我 运行 经常遇到这个问题,有一些不需要额外包的 basic R 解决方案会很有帮助。您能提供简单的滞后解决方案吗?

如果这不可能,您能否至少在这里提供您的解决方法,以便我们可以选择次优的替代方案?已存在一个合集 here

此外,在所有关于这个主题的博客文章中,我看到人们抱怨滞后是多么困难,那么我们如何才能将数据帧的简单滞后函数引入 R Core?对于来自 Stata 或 EViews 的任何人来说,这一定是非常令人失望的。还是我遗漏了什么并且有一个简单的内置解决方案?

假设我们想要在此处对每个 "country" 延迟 "value" 3 "year"s:

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 或数据 table),也不想在截止日期是今晚并且我们的主管使用 Stata 并认为时沉浸在三个新包中滞后很容易;-)(不是,我只是想做好准备...)

p.s.:

without groups

与 data.table: Lag in dataframe or How to create a lag variable within each group?

time series are straightforward

尝试使用数据合并包中的幻灯片,它很简单
slide(Data,Var='value',GroupVar = 'country',slideBy=-3)

如果问题是如何在不使用包的情况下提供包含前三年价值的列,那么试试这个:

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,您确实需要学习如何使用关键包。