Если это также учитывает столбец «Год», то мы должны сгруппировать по «Ключу» и «Году»
df1 %>%
group_by(Key, Year) %>%
mutate(n = sum(c("ok", "notok") %in% Type)) %>%
group_by(Key) %>%
filter(any(n == 2)) %>%
select(-n)
# A tibble: 5 x 3
# Groups: Key [1]
# Key Year Type
# <chr> <int> <chr>
#1 A 2000 ok
#2 A 2001 ok
#3 A 2001 notok
#4 A 2002 ok
#5 A 2003 ok
Или используя base R
ave
i1 <- with(df1, ave(ave(Type, Key, Year, FUN =
function(x) length(unique(x)))==2, Key, FUN = any))
df1[i1,]
# Key Year Type
#1 A 2000 ok
#2 A 2001 ok
#3 A 2001 notok
#4 A 2002 ok
#5 A 2003 ok
Или используя split
с table
subset(df1, Key %in% names(which(sapply(split(df1[-1], Key),
function(x) ncol(table(x))==2))))
Исходя из ожидаемого результата, после группировки по «Ключу», filter
эти «Ключ имеет оба»ok "и" notok "%in%
столбец 'Type'
df1 %>%
group_by(Key) %>%
filter(all(c("ok", "notok") %in% Type))
# A tibble: 5 x 3
# Groups: Key [1]
# Key Year Type
# <chr> <int> <chr>
#1 A 2000 ok
#2 A 2001 ok
#3 A 2001 notok
#4 A 2002 ok
#5 A 2003 ok
Если в 'Type' есть только 'ok' и 'notok', мы можем подсчитать количество уникальных элементов до filter
df1 %>%
group_by(Key) %>%
filter(n_distinct(Type)==2)
data
df1 <- structure(list(Key = c("A", "A", "A", "A", "A", "B", "B", "B",
"B", "B", "C", "C", "C", "C"), Year = c(2000L, 2001L, 2001L,
2002L, 2003L, 2000L, 2001L, 2001L, 2002L, 2003L, 2000L, 2001L,
2002L, 2003L), Type = c("ok", "ok", "notok", "ok", "ok", "ok",
"ok", "ok", "ok", "ok", "ok", "ok", "ok", "ok")), class = "data.frame", row.names = c(NA,
-14L))