Вы можете создать flag
для определения Person
, где type == 1
встречается до type == 2
.
library(dplyr)
df %>%
group_by(Person) %>%
summarise(flag = which.max(type == 1) < which.max(type == 2))
# Person flag
# <fct> <lgl>
#1 A1 FALSE
#2 A2 FALSE
#3 A3 FALSE
#4 A4 TRUE
#5 A5 TRUE
Использование той же логики с базой R aggregate
df1 <- aggregate(type~Person, df, function(x) which.max(x == 1) < which.max(x == 2))
df1
# Person type
#1 A1 FALSE
#2 A2 FALSE
#3 A3 FALSE
#4 A4 TRUE
#5 A5 TRUE
Вы могли бы затем подмножество type
, чтобы получить People
df1$Person[df1$type]
#[1] "A4" "A5"
Другой подход с использованием базы R ave
unique(df$Person[as.logical(with(df,
ave(type, Person, FUN = function(x) which.max(x == 1) < which.max(x == 2))))])
#[1] "A4" "A5"