繁体   English   中英

根据记录在 R 中的出现过滤记录

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM