【问题标题】:Consolidate multiple time intervals within a group unit (dplyr or data.table solution preferred)在一个组单元内合并多个时间间隔(首选 dplyr 或 data.table 解决方案)
【发布时间】: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)) &lt; start - 10L), by=.(personid)][, .(start = structure(min(start), class="Date"), end = structure(max(end), class="Date")), by=.(personid, grp)]

标签: r dplyr data.table lubridate


【解决方案1】:

一个tidyverse 的可能性。我们首先 group_by person_id 并创建一个新变量 (diffe),该变量在当前 start 天和前一天 (lag) end 之间的天数有所不同。我们将 10 天内的每个 person_iddiffe 分组为一组,并从每个组中选择 first start day 和 last end day。

library(tidyverse)

dat %>%
  group_by(personid) %>%
  mutate(diffe = as.numeric(start - lag(end))) %>%
  replace_na(list(diffe = 0)) %>%
  group_by(personid, group = cumsum(diffe > 10)) %>%
  summarise(start = first(start), 
            end = last(end)) %>%
  select(-group)


#  personid   start      end       
#     <int>   <date>     <date>    
#1        1 2017-09-01 2017-10-07
#2        2 2017-10-21 2017-11-01
#3        3 2017-12-01 2017-12-15
#4        3 2017-12-27 2017-12-31

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-27
    • 1970-01-01
    • 2014-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-10
    相关资源
    最近更新 更多