如何在检测到疾病后删除后续行(右删失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
相关产品推荐
相关产品推荐

