Search code examples
tidyverselag

Simple way to get lagged value of a specific row


I want to create a column called lag_diff3. This column is made by the difference of the lagged value in A = 2003. I can do this using the following code, but it seems ugly. Can I rewrite this problem by using a simple way

A = c("2001", "2002", "2003", "2004")
B = c(10, 20, 60, 70)
dat = tibble(A = A, B = B) %>%
    mutate(lag_diff1 = B - lag(B, 1),
           lag_diff2 = ifelse(A != "2003", -100, lag_diff1),
           lag_diff3 = max(lag_diff2)) 
> dat 
# A tibble: 4 × 5
  A         B lag_diff1 lag_diff2 lag_diff3
  <chr> <dbl>     <dbl>     <dbl>     <dbl>
1 2001     10        NA      -100        40
2 2002     20        10      -100        40
3 2003     60        40        40        40
4 2004     70        10      -100        40

Solution

  • You could do lag_diff1[A == "2003"]:

    library(dplyr)
    
    A = c("2001", "2002", "2003", "2004")
    B = c(10, 20, 60, 70)
    tibble(A = A, B = B) %>%
      mutate(lag_diff1 = B - lag(B, 1),
             lag_diff3 = lag_diff1[A == "2003"]) 
    #> # A tibble: 4 × 4
    #>   A         B lag_diff1 lag_diff3
    #>   <chr> <dbl>     <dbl>     <dbl>
    #> 1 2001     10        NA        40
    #> 2 2002     20        10        40
    #> 3 2003     60        40        40
    #> 4 2004     70        10        40