Вот несколько вариантов.
1) с использованием data.table
library(data.table)
setDT(dat)[dat[, .I[sum(key == 1) > 0], group]$V1]
# group key value
#1: A 1 3.97
#2: A 0 4.22
#3: A 1 2.60
#4: B 1 2.05
#5: B 0 2.67
#6: B 0 3.99
2) с base R
а) компактным способом с ave
dat[!!with(dat, ave(key, group, FUN = max)), ]
b) с использованием table
subset(dat, group %in% names(which(!!table(dat[1:2])[,2])))
c) с использованием rowsum
subset(dat, group %in% names(which((rowsum(key, group) > 0) [, 1])))
3) с использованием tidyverse
library(tidyverse)
dat %>%
group_by(group) %>%
filter(sum(key) > 0)
data
dat <- structure(list(group = c("A", "B", "C", "A", "B", "C", "A", "B",
"C"), key = c(1L, 1L, 0L, 0L, 0L, 0L, 1L, 0L, 0L), value = c(3.97,
2.05, 3.28, 4.22, 2.67, 5.02, 2.6, 3.99, 4.42)), class = "data.frame",
row.names = c("1",
"2", "3", "4", "5", "6", "7", "8", "9"))