我在 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
我需要从第一个 TRUE 开始的数据集作为输出。像这样的事情(从 2011 年 11 月 17 日开始):
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
知道如何做到这一点吗?谢谢!
最佳答案
一种选择是使用 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))
注意:不清楚原始数据中是否会有很多“id”并且需要分组。如果不是,则删除 group_by(id)
步骤
数据
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))
关于r - 我需要 R 在找到条件 = T 时开始过滤行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58509789/