Отставание переменной путем суммирования предыдущих 5 лет? - PullRequest
0 голосов
/ 02 февраля 2019

Я работаю с данными, которые выглядят так:

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 голосов
/ 02 февраля 2019

Используя ввод 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"))
0 голосов
/ 02 февраля 2019

Вы можете сделать:

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
...