I am sure there must be a simple solution to this...
I want to conditionally mutate a new column by groups, to create a rolling total based on the pct_change
column.
library(tidyverse)
#simulate some data
df <- tibble(
quarter = c("2009.1", "2009.2", "2009.3", "2009.4", "2010.1", "2010.2", "2010.3", "2010.4"),
group = c("a", "a", "a", "a", "b", "b", "b", "b"),
amount = c(100,NA, NA, NA, 200, NA, NA, NA),
pct_change = c(1.05, 1.06, 1.07, NA, 1.02, 0.99, 1.05, NA)
)
df
#> # A tibble: 8 x 4
#> quarter group amount pct_change
#> <chr> <chr> <dbl> <dbl>
#> 1 2009.1 a 100 1.05
#> 2 2009.2 a NA 1.06
#> 3 2009.3 a NA 1.07
#> 4 2009.4 a NA NA
#> 5 2010.1 b 200 1.02
#> 6 2010.2 b NA 0.99
#> 7 2010.3 b NA 1.05
#> 8 2010.4 b NA NA
#this doesn't work
df %>%
group_by(group) %>%
mutate(new_amount = case_when(!is.na(amount) ~ amount,
is.na(amount) ~ lag(amount, n=1L)*lag(pct_change, n=1L)))
#> # A tibble: 8 x 5
#> # Groups: group [2]
#> quarter group amount pct_change new_amount
#> <chr> <chr> <dbl> <dbl> <dbl>
#> 1 2009.1 a 100 1.05 100
#> 2 2009.2 a NA 1.06 105
#> 3 2009.3 a NA 1.07 NA
#> 4 2009.4 a NA NA NA
#> 5 2010.1 b 200 1.02 200
#> 6 2010.2 b NA 0.99 204
#> 7 2010.3 b NA 1.05 NA
#> 8 2010.4 b NA NA NA
#neither does this
df %>%
group_by(group) %>%
mutate(new_amount = case_when(!is.na(amount) ~ amount,
is.na(amount) ~ lag(new_amount, n=1L)*lag(pct_change, n=1L)))
#> Error in lag(new_amount, n = 1L): object 'new_amount' not found
#Output should look like this
df <- tibble(
quarter = c("2009.1", "2009.2", "2009.3", "2009.4", "2010.1", "2010.2", "2010.3", "2010.4"),
group = c("a", "a", "a", "a", "b", "b", "b", "b"),
amount = c(100,NA, NA, NA, 200, NA, NA, NA),
pct_change = c(1.05, 1.06, 1.07, NA, 1.02, 0.99, 1.05, NA),
new_amount = c(100, 105, 111.3, 119.091, 200, 204, 201.96, 212.058)
)
df
#> # A tibble: 8 x 5
#> quarter group amount pct_change new_amount
#> <chr> <chr> <dbl> <dbl> <dbl>
#> 1 2009.1 a 100 1.05 100
#> 2 2009.2 a NA 1.06 105
#> 3 2009.3 a NA 1.07 111.
#> 4 2009.4 a NA NA 119.
#> 5 2010.1 b 200 1.02 200
#> 6 2010.2 b NA 0.99 204
#> 7 2010.3 b NA 1.05 202.
#> 8 2010.4 b NA NA 212.
Created on 2019-10-23 by the reprex package (v0.3.0)
Many thanks.