【发布时间】:2022-02-21 15:59:34
【问题描述】:
我有一个诊所患者就诊的数据集。每个患者可以多次访问。每个患者由一个 study_id 标识,每次就诊由一个 disease_id 标识。我想迭代过滤数据框,以便删除上次访问后 28 天内发生的访问。
我不能简单地计算所有访问之间的间隔,然后删除那些发生在 28 天内的访问。在过滤数据帧时需要迭代计算间隔。
在下面的示例中,您可以看到患者 0003 出现了 3 次。访问 1 始终保留。第 2 次访问应在第 1 次访问 7 天后删除。访问 2 删除后,第 3 次访问将在第 1 次访问后 29 天出现,因此应保留。但是,如果我计算所有间隔,然后过滤掉任何间隔为 28 天或更短的访问,则访问 2 和 3 都将被删除(因为访问 2 发生在访问 1 后 7 天,访问 3 发生在访问 2 后 22 天) .
| study_id | illness_id | illness_date |
|---|---|---|
| 0001 | 000103/12/2007 | 2007/12/03 |
| 0002 | 000224/03/2008 | 2008/03/24 |
| 0002 | 000226/04/2008 | 2008/04/26 |
| 0002 | 000217/07/2008 | 2008/07/17 |
| 0002 | 000221/08/2008 | 2008/08/21 |
| 0002 | 000225/08/2008 | 2008/08/25 |
| 0003 | 000329/09/2008 | 2008/09/29 |
| 0003 | 000306/10/2008 | 2008/10/06 |
| 0003 | 000328/10/2008 | 2008/10/28 |
正确过滤的数据框应该是:
| study_id | illness_id | illness_date |
|---|---|---|
| 0001 | 000103/12/2007 | 2007/12/03 |
| 0002 | 000224/03/2008 | 2008/03/24 |
| 0002 | 000226/04/2008 | 2008/04/26 |
| 0002 | 000217/07/2008 | 2008/07/17 |
| 0002 | 000221/08/2008 | 2008/08/21 |
| 0003 | 000329/09/2008 | 2008/09/29 |
| 0003 | 000328/10/2008 | 2008/10/28 |
感谢您的帮助 - 我是 R 新手,正在努力解决迭代和循环问题。如果有一个涉及 dplyr 过滤器的简单解决方案,那就太好了。
针对下面的一些建议,我发布另一个示例以尝试使问题更清晰
无法在每位患者首次就诊时固定“比较器”行。它需要遍历数据框,因为过滤是迭代完成的。对不起,如果这在 OP 中不清楚。这是一个示例,其中应删除第 2、3 和 5 行,而应保留第 1、4 和 6 行。
第 2 行是第 1 行之后的 8 天,因此被删除。第 3 行是第 1 行之后的 26 天,因此被删除。第 4 行是第 1 行之后的 41 天,因此被保留并成为该患者后续就诊的比较对象。第 5 行是第 4 行之后的 6 天,因此被删除。第 6 行是第 4 行之后的 31 天,因此被保留并成为该患者后续就诊的比较对象。
| study_id | illness_id | illness_date |
|---|---|---|
| 0001 | 000119/12/2007 | 19/12/2007 |
| 0001 | 000127/12/2007 | 27/12/2007 |
| 0001 | 000114/01/2008 | 14/01/2008 |
| 0001 | 000129/01/2008 | 29/01/2008 |
| 0001 | 000104/02/2008 | 04/02/2008 |
| 0001 | 000129/02/2008 | 29/02/2008 |
这是@sbarbit提供的v优雅解决方案 - 真诚的感谢!!
df1 <- df |>
arrange(study_id, illness_date) |>
mutate(comparator = purrr::accumulate(illness_date,~ifelse(.y - .x > 28, .y,.x))) |>
mutate(daydiff = illness_date - lag(comparator, 1,0)) |>
mutate(daydiff = as.numeric(daydiff)) |>
filter(daydiff > 28)
【问题讨论】:
标签: r dplyr iteration filtering