Search code examples
rdplyrtidyversedata-manipulation

Change the values of rows conditionally in R


My data looks like this:

company_name <- c("A","A","A","A","B","B","B")
year <- c(1985, 1986, 1987, 1988, 1985, 1986, 1987)
value <- c(0, 1, 0, 0, 1, 0, 0)

df <- data.frame(company_name, year, value)

If the value is 1, I want to switch this row of value (value=1) with the next row (value=0). (group_by should be used for company_name) My output must be like this:

value <- c(0, 0, 1, 0, 0, 1, 0)

new_df <- data.frame(company_name, year, value)

Solution

  • Here is one potential solution:

    library(dplyr)
    
    company_name <- c("A","A","A","A","B","B","B")
    year <- c(1985, 1986, 1987, 1988, 1985, 1986, 1987)
    value <- c(0, 1, 0, 0, 1, 0, 0)
    
    df <- data.frame(company_name, year, value)
    
    answer <- df %>%
      group_by(company_name) %>%
      mutate(value = ifelse(lag(value, default = 0) == 1, lag(value), 0))
    
    value <- c(0, 0, 1, 0, 0, 1, 0)
    new_df <- data.frame(company_name, year, value)
    
    all_equal(answer, new_df)
    #> [1] TRUE
    

    Created on 2022-11-25 by the reprex package (v2.0.1)