This would be one way to do it (I'm assuming that by "multiple times" you mean more than 1)
library(dplyr)
library(fuzzyjoin)
df1 <- data.frame(stringsAsFactors=FALSE,
YEAR = c(2004L, 2004L, 2005L, 2005L, 2006L, 2006L, 2007L, 2008L),
COMPANY_ID = c("x", "y", "a", "z", "x", "a", "y", "b")
)
df2 <- data.frame(stringsAsFactors=FALSE,
YEAR = c(2004L, 2004L, 2005L, 2006L, 2008L),
COMPANY_ID = c("x", "y", "a", "x", "b")
)
df2 %>%
mutate(end_year = YEAR + 2) %>%
fuzzy_left_join(df1,
by = c("YEAR" = "YEAR",
"end_year" = "YEAR",
"COMPANY_ID" = "COMPANY_ID"),
match_fun = list(`<=`, `>=`, `==`)) %>%
count(YEAR = YEAR.x, COMPANY_ID = COMPANY_ID.x, name = "dummy") %>%
mutate(dummy = if_else(dummy > 1, 1, 0))
#> # A tibble: 5 x 3
#> YEAR COMPANY_ID dummy
#> <int> <chr> <dbl>
#> 1 2004 x 1
#> 2 2004 y 0
#> 3 2005 a 1
#> 4 2006 x 0
#> 5 2008 b 0
Created on 2019-11-25 by the reprex package (v0.3.0.9000)