【发布时间】:2021-09-16 21:22:32
【问题描述】:
我在 R 中遇到了一个古怪的数据形状,我无法有效地解决这个问题。实际上,我通过一些简单的连接找到了一些解决方案,但让我们假设我的数据非常大,并且这样做会显着增加我的内存使用量,这在这里不是最佳的。另一个解决方案,甚至不是最优的,将涉及循环遍历整个数据集,再次发现它的效率有点低。
数据集的想法是为给定的人群提供测试疾病的日期时间间隔以及与之相关的结果。数据按行组织,每一行是给定 id 和测试结果的时间间隔(在我的示例中,我只选择正面测试,但也可能是负面的)。通常这些时期是连续的,即第二个时期的开始是在第一个时期结束之后的一天(参见示例),但有时几个月可以在没有任何信息的情况下过去,然后执行另一个测试。
以下是数据示例:
library(tidyverse)
library(lubridate)
start <- c('2017-08-28', '2018-03-14', '2018-08-27', '2020-02-26', '2020-09-01')
finish <- c('2018-03-13', '2018-08-26', '2018-11-28', '2020-08-31', '2021-03-01')
id <- rep('a', 5)
df <- data.frame('start' = ymd(start),
'finish' = ymd(finish),
'id' = id,
'test' = rep('positif', 5))
这给出了:
> df
start finish id test
1 2017-08-28 2018-03-13 a positif
2 2018-03-14 2018-08-26 a positif
3 2018-08-27 2018-11-28 a positif
4 2020-02-26 2020-08-31 a positif
5 2020-09-01 2021-03-01 a positif
经过一些调整,想法是计算每次测试之间的天间隔
dff <- df %>%
mutate(finish_lag = lag(finish),
interval = start - finish_lag
)
> dff
start finish id test finish_lag interval
1 2017-08-28 2018-03-13 a positif <NA> NA days
2 2018-03-14 2018-08-26 a positif 2018-03-13 1 days
3 2018-08-27 2018-11-28 a positif 2018-08-26 1 days
4 2020-02-26 2020-08-31 a positif 2018-11-28 455 days
5 2020-09-01 2021-03-01 a positif 2020-08-31 1 days
我想要的是,每行有一个 ID,持续一段时间,在这个例子中,我只有 2 行:第一个周期(第 1 到 3 行),然后是 455 天后的第二个周期到数据的末尾。通常我只会有 1 行,因为测试是连续的。
所以在这个例子中,期望的输出是:
start finish id test
1 2017-08-28 2018-11-28 a positif
2 2020-02-26 2021-03-01 a positif
【问题讨论】: