R语言技术问题:按ID保留至test.result首次出现1的所有数据并过滤后续内容
解决方案:保留每个患者首次出现test.result=1前的所有数据
你的原有代码问题在于:filter(test.result == max(test.result))仅保留了每个分组中test.result等于最大值的行(即所有test.result=1的行),既丢失了之前的0值数据,也没过滤掉首次出现1之后的其他行。
以下是两种可行的修正方案:
方法1:用累计标记过滤
通过cumsum标记是否已出现过1,保留首次出现1及之前的所有行:
new.ddset <- ddset %>% group_by(id) %>% mutate(has_positive = cumsum(test.result == 1)) %>% filter(has_positive <= 1) %>% select(-has_positive) %>% ungroup()
cumsum(test.result == 1)会逐行累计当前分组中出现过的1的次数,未出现1时为0,首次出现1时变为1,之后的行累计值会≥2filter(has_positive <= 1)保留所有未出现1的行(累计值0)和首次出现1的行(累计值1)
方法2:用行索引截取
直接定位首次出现1的行位置,截取到该位置的所有行(无1则保留全部):
new.ddset <- ddset %>% group_by(id) %>% slice(1:ifelse(any(test.result == 1), which(test.result == 1)[1], n())) %>% ungroup()
which(test.result == 1)[1]获取当前分组中首次出现1的行号ifelse处理无1的情况:若分组中没有test.result=1的行,就保留从第1行到最后一行(n()为分组总行数)
两种方法都能实现你的需求:比如id1的screen.num1-5为0、screen.num6为1时,会保留1-6的所有数据,删除之后的行。
内容的提问来源于stack exchange,提问作者DN98024
相关产品推荐
相关产品推荐

