Вы можете использовать left_join данных с group_by, отфильтрованным, суммированным.
library(dplyr)
data %>% left_join(
group_by(data, VisitID) %>%
distinct(VisitID, Item) %>%
filter(Item %in% c("A","B","C")) %>%
summarise(set=paste0(Item, collapse="&")),
by="VisitID")
Выход:
VisitID Item set
1 1 A A&B&C
2 1 B A&B&C
3 1 C A&B&C
4 1 D A&B&C
5 2 A A&B
6 2 D A&B
7 2 B A&B
8 3 B B&C
9 3 C B&C
10 4 D C
11 4 C C
12 5 D <NA>
13 5 E <NA>
Данные : dput (данные)
structure(list(VisitID = c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L,
4L, 4L, 5L, 5L), Item = c("A", "B", "C", "D", "A", "D", "B",
"B", "C", "D", "C", "D", "E")), class = "data.frame", row.names = c(NA,
-13L))