Мы можем сделать двойной filter
после группировки по "ID". Сначала filter
для строк, где Book - «B», а Interv - «G». Затем найдите «ID», имеющие all
«Y1», «Z1» в группе или «Y2», «Z2» в группе (как @Gregor упомянул в комментариях)
df1 %>%
group_by(ID) %>%
filter(Book == "B", Interv == "G") %>%
filter(all(c("Y1", "Z1") %in% Group)| all(c("Y2", "Z2") %in% Group))
# A tibble: 10 x 4
# Groups: ID [5]
# ID Group Interv Book
# <int> <chr> <chr> <chr>
# 1 2 Y2 G B
# 2 2 Z2 G B
# 3 3 Y1 G B
# 4 3 Z1 G B
# 5 5 Y2 G B
# 6 5 Z2 G B
# 7 6 Z1 G B
# 8 6 Y1 G B
# 9 7 Z1 G B
#10 7 Y1 G B
Или мы делаем
df1 %>%
group_by(ID) %>%
filter(all(c("Y1", "Z1") %in% Group[Book == "B" & Interv == "G"])|
all(c("Y2", "Z2") %in% Group[Book == "B" & Interv == "G"]))
Повторное выражение может быть создано ранее, а затем оценено
expr <- quo(Book == "B" & Interv == "G")
df1 %>%
group_by(ID) %>%
filter(all(c("Y1", "Z1") %in% Group[!!expr])|
all(c("Y2", "Z2") %in% Group[!!expr]))