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

如何在检测到疾病后删除后续行(右删失Right censoring)

右删失数据处理:保留首次te_yn=1的行及之前观测

需求说明

按record_id分组做右删失:每个分组里,保留首次出现te_yn=1的行,删掉该行之后的所有观测;如果分组里没有te_yn=1,就保留全部数据。

你的尝试代码

library(dplyr)
test %>% group_by(record_id) %>% filter(if(1 %in% te_yn) row_number() == 1: (which(te_yn == 1) -1) else TRUE)

问题出在这两点

  • 逻辑偏差:你要保留首次te_yn=1的行,但代码里写的是row_number() == 1:(which(te_yn ==1)-1),直接把首次出现1的那行排除了,和需求不符。
  • 潜在bug:which(te_yn ==1)会返回所有te_yn=1的位置,如果一个分组里有多个1,就会生成一个向量,和row_number()比较时会出现长度不匹配的报错。

正确解决方案

方法1:简洁版(推荐)

直接判断行号是否小于等于首次te_yn=1的位置,无1则保留全部:

library(dplyr)

result <- est %>%
  group_by(record_id) %>%
  filter(row_number() <= if(any(te_yn == 1)) which(te_yn == 1)[1] else n()) %>%
  ungroup()

方法2:用累积判断标记

利用cumany标记首次出现1后的所有行,筛选掉这些行:

result <- est %>%
  group_by(record_id) %>%
  filter(!cumany(row_number() > which(te_yn == 1)[1])) %>%
  ungroup()

注:如果分组中无te_yn=1,which(te_yn ==1)[1]会返回NA,cumany(NA)为FALSE,取反后保留全部行,符合需求。

验证结果

用你提供的est数据测试:

  • record_id=120321的首次te_yn=1在第13行,处理后保留前13行;
  • record_id=120322的首次te_yn=1在第6行,处理后保留前6行;
    完全匹配需求。

内容的提问来源于stack exchange,提问作者Levi M

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 22:33:31