1. База R
В базе R следующее можно легко переписать как однострочное:
i <- ave(as.logical(df$completion), df$people, FUN = function(x) any(x != 0, na.rm = TRUE))
df <- df[which(i), ]
df
# people activity completion
#1 1 1 0
#2 1 1 0
#3 1 1 1
#4 2 2 0
#5 2 2 1
#6 3 3 1
#7 3 4 1
#10 5 6 0
#11 5 6 1
2. Пакет dplyr
И вот способ dplyr
.
Сначала отфильтруйте только людей, которые выполнили действие, затем присоединитесь к исходному набору данных, чтобы получить все столбцы.
df <- df %>%
group_by(people) %>%
summarise(completion = any(as.logical(completion))) %>%
filter(completion) %>%
select(-completion) %>%
left_join(df, by = 'people')
df
#`summarise()` ungrouping output (override with `.groups` argument)
## A tibble: 9 x 3
# people activity completion
# <dbl> <dbl> <dbl>
#1 1 1 0
#2 1 1 0
#3 1 1 1
#4 2 2 0
#5 2 2 1
#6 3 3 1
#7 3 4 1
#8 5 6 0
#9 5 6 1
Data
В вопросе нет инструкции data.frame
, только создание векторов столбцов.
people <- c(1,1,1,2,2,3,3,4,4,5,5)
activity <- c(1,1,1,2,2,3,4,5,5,6,6)
completion <- c(0,0,1,0,1,1,1,0,0,0,1)
df <- data.frame(people, activity, completion)