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)
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)