Мне нужно R, чтобы начать фильтрацию строк, когда находит условие = T - PullRequest
2 голосов
/ 22 октября 2019

У меня есть набор данных в R, как показано ниже:

id     species date
obs01  FALSE   28/12/2009
obs01  FALSE   14/11/2010
obs01  FALSE   31/12/2010
obs01  TRUE    17/11/2011
obs01  FALSE   10/12/2011
obs01  FALSE   30/12/2011
obs01  FALSE   16/12/2012
obs01  FALSE   17/12/2012
obs01  FALSE   2/11/2013
obs01  FALSE   10/11/2013
obs01  TRUE    11/11/2013       
obs01  FALSE   20/11/2013

Мне нужен набор данных с первого ИСТИНА и далее в качестве вывода. Примерно так (начиная с 17.11.2011):

id     species date
obs01  TRUE    17/11/2011
obs01  FALSE   10/12/2011
obs01  FALSE   30/12/2011
obs01  FALSE   16/12/2012
obs01  FALSE   17/12/2012
obs01  FALSE   2/11/2013
obs01  FALSE   10/11/2013
obs01  TRUE    11/11/2013       
obs01  FALSE   20/11/2013

Есть идеи, как это сделать? Спасибо!

Ответы [ 2 ]

2 голосов
/ 22 октября 2019

Один из вариантов - создать 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))
1 голос
/ 22 октября 2019

Вы также можете попробовать:

df[as.logical(cummax(df$species)), ]

      id species       date
4  obs01    TRUE 17/11/2011
5  obs01   FALSE 10/12/2011
6  obs01   FALSE 30/12/2011
7  obs01   FALSE 16/12/2012
8  obs01   FALSE 17/12/2012
9  obs01   FALSE  2/11/2013
10 obs01   FALSE 10/11/2013
11 obs01    TRUE 11/11/2013
12 obs01   FALSE 20/11/2013
...