Мы можем использовать filter
после шага group_by
и убедиться, что в группе есть и «Sp1», и «Sp2» с %in%
и all
library(dplyr)
df %>%
group_by(groups) %>%
filter(all(c("Sp1", "Sp2") %in% names))
# A tibble: 6 x 3
# Groups: groups [2]
# groups names col3
# <chr> <chr> <chr>
#1 group2 Sp1 OK
#2 group2 Sp2 OK
#3 group2 Sp3 OK
#4 group4 Sp1 OK
#5 group4 Sp2 OK
#6 group4 Sp2 OK
Или используя base R
с table
и subset
subset(df, groups %in% names(which(!rowSums(!table(subset(df,
names %in% c("Sp1", "Sp2"), select = 1:2))))))
Обратите внимание, что проблема с использованием &
заключается в том, что мы проверяем, находятся ли оба «Sp1» и «Sp2» вта же строка «имен», что вряд ли произойдет. Вместо этого логика будет заключаться в том, можно ли найти их обоих в «именах» для конкретной группы
data
df <- structure(list(groups = c("group1", "group1", "group1", "group1",
"group2", "group2", "group2", "group3", "group4", "group4", "group4"
), names = c("Sp1", "Sp3", "Sp7", "Sp3", "Sp1", "Sp2", "Sp3",
"Sp1", "Sp1", "Sp2", "Sp2"), col3 = c("OK", "OK", "OK", "OK",
"OK", "OK", "OK", "OK", "OK", "OK", "OK")),
class = "data.frame", row.names = c(NA,
-11L))