You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 12:21:29