【发布时间】:2019-08-01 07:34:03
【问题描述】:
我遇到了一个棘手的小编码问题,希望有人能找到解决方案。
我基本上有一个非常大的逗留数据集(人员 ID、入院、出院),>1000 万。
library(dplyr)
library(lubridate)
dat <- read.csv(text="
personid, start, end
1, 2017-09-01, 2017-10-01
1, 2017-10-05, 2017-10-07
2, 2017-10-21, 2017-11-01
3, 2017-12-01, 2017-12-15
3, 2017-12-27, 2017-12-31") %>%
transmute(
personid,
start = ymd(start),
end = ymd(end))
每次逗留不重叠,但我们有一个逻辑规则,如果逗留时间在 10 天内,我们希望将它们合并为一个(即保留较早的录取和较晚的出院)。因此,最终的数据集是唯一的,彼此至少相隔 10 天。
例如:
1, 2017-09-01, 2017-10-07
2, 2017-10-21, 2017-11-01
3, 2017-12-01, 2017-12-15
3, 2017-12-27, 2017-12-31
有一些关于重叠间隔的帖子,但这有点不同:Consolidating set of time intervals, chains of intervals to single interval 与我需要的相比,我认为过于复杂。
我也希望有一个 dplyr 或 data.table 解决方案,尽管 group_by 语句需要相当长的时间。
【问题讨论】:
-
见stackoverflow.com/questions/52091907/…和stackoverflow.com/questions/28938147/…。所以,本质上,
dat[, c("start", "end") := lapply(.SD, function(x) as.integer(as.Date(x))), .SDcols=c("start","end")][ order(start, end), grp := cumsum(cummax(shift(end, fill = 0L)) < start - 10L), by=.(personid)][, .(start = structure(min(start), class="Date"), end = structure(max(end), class="Date")), by=.(personid, grp)]
标签: r dplyr data.table lubridate