首页 > 解决方案 > 在 R 中发生 Event/Diseased(1) 之后删除行

问题描述

我是 R 新手,我有一组带有疾病状态的专利 ID。我想在疾病发生 1 种状态后删除这些行。我的数据集看起来像

ID  Date        Disease
123 02-03-2012  0
123 03-03-2013  1
123 04-03-2014  0
321 03-03-2015  1
423 06-06-2016  1
423 07-06-2017  1
543 08-05-2018  1
543 09-06-2019  0
645 08-09-2019  0
645 10-10-2018  0
645 11-10 -2012 0

预期产出

ID     Date       Disease
123  02-03-2012    0
123  03-03-2013    1
321  03-03-2015    1
423  06-06-2016    1
543  08-05-2018    1
645  08-09-2019    0
645  10-10-2018    0
645  11-10 -2012   0

请建议一个返回预期输出的代码。提前致谢!

标签: rdplyr

解决方案


使用dplyr一种方法是选择所有行,如果没有 Disease == 1出现在一个ID或只选择行直到第一个 1。

library(dplyr)
df %>%
  group_by(ID) %>%
  filter(if(any(Disease == 1)) row_number() <= match(1, Disease) else TRUE)

#     ID Date       Disease
#  <int> <chr>        <int>
#1   123 02-03-2012       0
#2   123 03-03-2013       1
#3   321 03-03-2015       1
#4   423 06-06-2016       1
#5   543 08-05-2018       1
#6   645 08-09-2019       0
#7   645 10-10-2018       0
#8   645 11-10-2012       0

数据

df <- structure(list(ID = c(123L, 123L, 123L, 321L, 423L, 423L, 543L, 
543L, 645L, 645L, 645L), Date = c("02-03-2012", "03-03-2013", 
"04-03-2014", "03-03-2015", "06-06-2016", "07-06-2017", "08-05-2018", 
"09-06-2019", "08-09-2019", "10-10-2018", "11-10-2012"), Disease = c(0L, 
1L, 0L, 1L, 1L, 1L, 1L, 0L, 0L, 0L, 0L)), class = "data.frame", row.names = c(NA, 
-11L))

推荐阅读