dplyr 中的滞后滚动间隔 window
Lagged rolling interval window in dplyr
我有一个类似 df 的数据集,其中 year_month 表示前 2 位数字中的年份,以及月份最后 2 位数字 (1901=01/2019).
id <- c(1,1,1,1,1,2,2,2,2,2)
year_month <- c(1801,1809,1812,1901,1908, 1901,1909,1912,2011,2012 )
value <- c(10,20,30,40,50,60,70,80,90,100)
df <- data.frame(id, year_month, value)
我想总结每个公司在过去一年中的累计价值(例如,如果我们在 1901=01/2019,我想从 1801 年开始计算(01 /2018) 并记录 1901 年之前的历史值,即从 1801 年到 1812 年)。数据集看起来像 one_year_window
value_last_year <- c(NA,10,30,60,90,NA,60,130,80,170)
one_year_window <- data.frame(id, year_month, value, value_last_year)
我在 dplyr 中尝试了几种方法 (cummsum()) 都没有成功。
有线索吗?
df %>%
group_by(id, year = round(year_month, -2)) %>%
mutate(value_last_year = cumsum(value)) %>%
ungroup(year) %>%
mutate(value_last_year = ifelse(year == max(year), value, NA)) %>%
ungroup() %>%
select(-year)
尽管计算所有年份的累计总和然后按 id
和 year_month
过滤可能对您有利(如果您需要他们的最新记录)。
输出
id year_month value value_last_year
<dbl> <dbl> <dbl> <dbl>
1 1 1801 10 NA
2 1 1809 20 NA
3 1 1812 30 NA
4 1 1901 40 40
5 1 1908 50 50
6 2 1901 60 NA
7 2 1909 70 NA
8 2 1912 80 NA
9 2 2011 90 90
10 2 2012 100 100
更新
基于您更新后的 post。我不相信这个答案。您应该关注此 link 并在此处投票支持基于以下内容的答案:
library(dplyr)
library(lubridate)
library(zoo)
df %>%
mutate(yrmd = ymd(paste0(year_month, "01"))) %>%
group_by(id) %>%
mutate(value_last_year = rollapplyr(value, width = 1:n() - findInterval(yrmd %m-% months(13), yrmd), sum),
value_last_year = ifelse(row_number() == 1, NA, value_last_year - value)) %>%
select(-yrmd) %>%
ungroup()
输出
id year_month value value_last_year
<dbl> <dbl> <dbl> <dbl>
1 1 1801 10 NA
2 1 1809 20 30
3 1 1812 30 60
4 1 1901 40 90
5 1 1908 50 140
6 2 1901 60 NA
7 2 1909 70 130
8 2 1912 80 210
9 2 2011 90 170
10 2 2012 100 190
我有一个类似 df 的数据集,其中 year_month 表示前 2 位数字中的年份,以及月份最后 2 位数字 (1901=01/2019).
id <- c(1,1,1,1,1,2,2,2,2,2)
year_month <- c(1801,1809,1812,1901,1908, 1901,1909,1912,2011,2012 )
value <- c(10,20,30,40,50,60,70,80,90,100)
df <- data.frame(id, year_month, value)
我想总结每个公司在过去一年中的累计价值(例如,如果我们在 1901=01/2019,我想从 1801 年开始计算(01 /2018) 并记录 1901 年之前的历史值,即从 1801 年到 1812 年)。数据集看起来像 one_year_window
value_last_year <- c(NA,10,30,60,90,NA,60,130,80,170)
one_year_window <- data.frame(id, year_month, value, value_last_year)
我在 dplyr 中尝试了几种方法 (cummsum()) 都没有成功。
有线索吗?
df %>%
group_by(id, year = round(year_month, -2)) %>%
mutate(value_last_year = cumsum(value)) %>%
ungroup(year) %>%
mutate(value_last_year = ifelse(year == max(year), value, NA)) %>%
ungroup() %>%
select(-year)
尽管计算所有年份的累计总和然后按 id
和 year_month
过滤可能对您有利(如果您需要他们的最新记录)。
输出
id year_month value value_last_year
<dbl> <dbl> <dbl> <dbl>
1 1 1801 10 NA
2 1 1809 20 NA
3 1 1812 30 NA
4 1 1901 40 40
5 1 1908 50 50
6 2 1901 60 NA
7 2 1909 70 NA
8 2 1912 80 NA
9 2 2011 90 90
10 2 2012 100 100
更新
基于您更新后的 post。我不相信这个答案。您应该关注此 link 并在此处投票支持基于以下内容的答案:
library(dplyr)
library(lubridate)
library(zoo)
df %>%
mutate(yrmd = ymd(paste0(year_month, "01"))) %>%
group_by(id) %>%
mutate(value_last_year = rollapplyr(value, width = 1:n() - findInterval(yrmd %m-% months(13), yrmd), sum),
value_last_year = ifelse(row_number() == 1, NA, value_last_year - value)) %>%
select(-yrmd) %>%
ungroup()
输出
id year_month value value_last_year
<dbl> <dbl> <dbl> <dbl>
1 1 1801 10 NA
2 1 1809 20 30
3 1 1812 30 60
4 1 1901 40 90
5 1 1908 50 140
6 2 1901 60 NA
7 2 1909 70 130
8 2 1912 80 210
9 2 2011 90 170
10 2 2012 100 190