在R中过滤记录:保留outcome=1的记录并删除其后无结果记录
解决方案
你的需求核心是:按id分组,保留每个分组中最后一条outcome==1记录及之前的所有记录(包含该分组内所有outcome==1的记录,以及这些1之前的outcome==0记录)。原代码的问题在于错误地按id+outcome分组,且没有定位到每个id最后一次出现outcome==1的时间节点,导致逻辑不符合需求。
以下是修正后的dplyr代码:
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)) ) filtered_dat <- dat1 %>% arrange(id, surv_date) %>% group_by(id) %>% # 计算每个id最后一次出现outcome==1的日期;若该id无outcome==1的记录,则保留所有日期 mutate(last_outcome1_date = ifelse(any(outcome == 1), max(surv_date[outcome == 1]), max(surv_date))) %>% # 保留所有早于等于最后一个outcome==1日期的记录 filter(surv_date <= last_outcome1_date) %>% ungroup() %>% select(-last_outcome1_date) # 移除临时计算的列 # 查看结果 filtered_dat
代码说明
arrange(id, surv_date):先按id分组,再按日期升序排序,确保记录时间顺序正确。group_by(id):仅按id分组,保证每个分组内的处理是针对同一个用户的所有记录。last_outcome1_date:通过ifelse判断每个id是否存在outcome==1的记录:- 若存在,取该
id所有outcome==1记录中的最大日期(即最后一次出现1的日期); - 若不存在,取该
id的最大日期(即保留所有记录)。
- 若存在,取该
filter(surv_date <= last_outcome1_date):过滤出最后一个1的日期及之前的所有记录,自动剔除该日期之后的所有outcome==0记录。
内容的提问来源于stack exchange,提问作者Moses
相关产品推荐
相关产品推荐

