Не думаю, что это очень элегантно, но результат соответствует ожидаемому результату, поэтому: Вот оно.
library(lubridate)
library(dplyr)
library(tidyr)
df2$date <- mdy(df2$date)
df2 %>%
inner_join(df1, by = "customer_id", copy = TRUE) %>%
gather(key = "group", value = "member", group_a:group_d) %>%
filter(member == "true") %>%
complete(date, group) %>%
select(date, group, customer_id) -> df3
df3 %>%
group_by(group, date) %>%
summarise(record = n_distinct(customer_id, na.rm = TRUE)) %>%
left_join( df3 %>%
group_by(group) %>%
summarise(total = n_distinct(customer_id, na.rm = TRUE)),
by = "group") %>% ungroup() %>%
select(date, group, record, total) -> result
, что дает:
# A tibble: 16 x 4
date group record total
<date> <chr> <int> <int>
1 2019-01-01 group_a 1 1
2 2019-01-02 group_a 1 1
3 2019-01-03 group_a 1 1
4 2019-01-04 group_a 1 1
5 2019-01-01 group_b 2 2
6 2019-01-02 group_b 1 2
7 2019-01-03 group_b 2 2
8 2019-01-04 group_b 0 2
9 2019-01-01 group_c 2 2
10 2019-01-02 group_c 1 2
11 2019-01-03 group_c 2 2
12 2019-01-04 group_c 1 2
13 2019-01-01 group_d 1 1
14 2019-01-02 group_d 1 1
15 2019-01-03 group_d 1 1
16 2019-01-04 group_d 0 1