是否有简单的方法可以在数据框中(按组)滞后,而无需 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.:
与 data.table: Lag in dataframe or How to create a lag variable within each group?
尝试使用数据合并包中的幻灯片,它很简单
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,您确实需要学习如何使用关键包。
每当我想在数据框中滞后时,我就会意识到本应简单的东西却并非如此。虽然这个问题已被多次询问和回答(参见 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.:
与 data.table: Lag in dataframe or How to create a lag variable within each group?
尝试使用数据合并包中的幻灯片,它很简单
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,您确实需要学习如何使用关键包。