[英]Filter records based on their occurrence in R
我会过滤到一些记录以保留有结果 == 1 的记录,但删除没有结果的后续记录。 例如,对于 id s001,我想保留 2020-04-23 和 2020-05-18 的记录,但删除后续记录。 与 2020-09-30 之后的 s002 删除记录相同。
library(dplyr)
set.seed(2022)
dat1 <- tibble(
surv_date = seq.Date(as.Date("2020-04-03"), as.Date("2021-01-01"), by = 5),
outcome = rbinom(55, 1, 0.3),
id = paste0("s00", rbinom(55, 10, 0.3))
)
first_dat <- dat1 %>%
arrange(id, surv_date) %>%
group_by(id, outcome) %>%
mutate(occurance = row_number()) %>%
filter(occurance == 1 & outcome == 1 )
second_dat <- dat1 %>%
arrange(id, surv_date) %>%
group_by(id, outcome) %>%
mutate(occurance = row_number()) %>%
filter( outcome == 0 )
first_dat %>%
bind_rows(second_dat) %>%
arrange(id, surv_date)
也许您可以使用cumall
类的东西,它将包括所有行,直到在filter
中评估第一个 FALSE 为止。 如果前一行的outcome
为 1,则省略该行和所有后续行。 或者换句话说,保留所有行,直到前一个lag
行为 1。
dat1 %>%
arrange(id, surv_date) %>%
group_by(id) %>%
filter(cumall(lag(outcome, default = 0) != 1))
输出
surv_date outcome id
<date> <int> <chr>
1 2020-04-23 0 s001
2 2020-05-18 1 s001
3 2020-04-08 0 s002
4 2020-06-07 0 s002
5 2020-09-10 0 s002
6 2020-09-25 0 s002
7 2020-09-30 1 s002
8 2020-04-03 1 s003
9 2020-05-08 0 s004
10 2020-05-13 0 s004
11 2020-05-23 0 s004
12 2020-07-02 0 s004
13 2020-07-22 0 s004
14 2020-08-16 1 s004
15 2020-06-17 0 s005
16 2020-06-22 1 s005
17 2020-11-14 0 s006
18 2020-12-29 0 s006
19 2020-10-30 0 s007
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.