Мы можем выбрать группы, в которых any
Item
имеет либо 'A'
, либо 'B'
.
library(dplyr)
df %>% group_by(VisitID) %>% filter(any(Item %in% c('A', 'B')))
# VisitID Item
# <int> <fct>
#1 1 A
#2 1 B
#3 1 C
#4 1 D
#5 2 A
#6 2 D
#7 2 B
#8 3 B
#9 3 C
Или в базе R:
subset(df, ave(Item %in% c('A', 'B'), VisitID, FUN = any))
и в data.table
library(data.table)
setDT(df)[, .SD[any(Item %in% c('A', 'B'))], VisitID]
data
df <- structure(list(VisitID = c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L,
4L, 4L), Item = structure(c(1L, 2L, 3L, 4L, 1L, 4L, 2L, 2L, 3L,
4L, 3L), .Label = c("A", "B", "C", "D"), class = "factor")),
row.names = c(NA, -11L), class = "data.frame")