通过累加前5年来滞后变量?

时间:2019-02-01 22:44:56

标签: r aggregate lag

我在处理数据看起来像这样的:

Country Year       Aid
Angola 1995 416420000
Angola 1996 459310000
Angola 1997 354660000
Angola 1998 335270000
Angola 1999 387540000
Angola 2000 302210000

我想通过在数据相加过去五年来创建一个滞后变量

为了使观察2000看起来像这样:

Country Year       Aid  Lagged5
Angola 2000  416420000  1953200000

将1995年至1999年的援助观察结果加在一起得出:

416420000 + 459310000 + 354660000 + 335270000 + 387540000 = 1953200000

此外,我也需要按国家/地区分组。

谢谢!

2 个答案:

答案 0 :(得分:1)

您可以这样做:

library(dplyr)

df %>%
  group_by(Country) %>%
  mutate(Lagged5 = sapply(Year, function(x) sum(Aid[between(Year, x - 5, x - 1)])))

输出:

# A tibble: 6 x 4
# Groups:   Country [1]
  Country  Year       Aid    Lagged5
  <chr>   <int>     <int>      <int>
1 Angola   1995 416420000          0
2 Angola   1996 459310000  416420000
3 Angola   1997 354660000  875730000
4 Angola   1998 335270000 1230390000
5 Angola   1999 387540000 1565660000
6 Angola   2000 302210000 1953200000

答案 1 :(得分:0)

使用在结尾处的注释中可重复显示的输入DF,定义一个roll函数,该函数求和前5行,并使用ave在每个国家/地区运行。 list(-seq(5))rollapplyr的宽度参数意味着在求和时使用偏移-1,-2,-3,-4,-5,即前5行中的值。

该问题并未讨论如何处理每个国家/地区中的前几行,因此我们输入了NA值,但如果要部分取和,请将partial = TRUE参数添加到rollapplyr。您还可以更改fill=NA一些其他的价值,如果你愿意的话那是相当灵活的。

library(zoo)

roll <- function(x) rollapplyr(x, list(-seq(5)), sum, fill = NA)
transform(DF, Lag5 = ave(Aid, Country, FUN = roll))

注意

假定输入为以下内容。我们添加了第二个国家。

Lines <- "Country Year       Aid
Angola 1995 416420000
Angola 1996 459310000
Angola 1997 354660000
Angola 1998 335270000
Angola 1999 387540000
Angola 2000 302210000"
DF <- read.table(text = Lines, header = TRUE, strip.white = TRUE, 
  colClasses = c("character", "integer", "numeric"))
DF <- rbind(DF, transform(DF, Country = "Belize"))