Один из вариантов - создать filter
с cumsum
library(dplyr)
df1 %>%
group_by(id) %>%
filter(cumsum(species) >0)
# A tibble: 9 x 3
# Groups: id [1]
# id species date
# <chr> <lgl> <chr>
#1 obs01 TRUE 17/11/2011
#2 obs01 FALSE 10/12/2011
#3 obs01 FALSE 30/12/2011
#4 obs01 FALSE 16/12/2012
#5 obs01 FALSE 17/12/2012
#6 obs01 FALSE 2/11/2013
#7 obs01 FALSE 10/11/2013
#8 obs01 TRUE 11/11/2013
#9 obs01 FALSE 20/11/2013
. Или, как упомянуто @ r2evans, cumany
можно использовать
df1 %>%
group_by(id) %>%
filter(cumany(species))
ПРИМЕЧАНИЕ. в исходных данных будет много идентификаторов, и их необходимо сгруппировать. В противном случае удалите group_by(id)
step
data
df1 <- structure(list(id = c("obs01", "obs01", "obs01", "obs01", "obs01",
"obs01", "obs01", "obs01", "obs01", "obs01", "obs01", "obs01"
), species = c(FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE,
FALSE, FALSE, FALSE, TRUE, FALSE), date = c("28/12/2009", "14/11/2010",
"31/12/2010", "17/11/2011", "10/12/2011", "30/12/2011", "16/12/2012",
"17/12/2012", "2/11/2013", "10/11/2013", "11/11/2013", "20/11/2013"
)), class = "data.frame", row.names = c(NA, -12L))