通过将前 5 年相加来滞后变量?
Lagging a variable by adding up the previous 5 years?
我正在处理如下所示的数据:
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
此外,我还需要按国家分组。
谢谢!
你可以这样做:
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
使用最后注释中可重复显示的输入 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"))
我正在处理如下所示的数据:
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
此外,我还需要按国家分组。
谢谢!
你可以这样做:
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
使用最后注释中可重复显示的输入 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"))