当日期在 R 中重叠时查找项目组合

find combination of items when the dates overlap in R

以下数据包含四列:id(个人id),item(因素),purchase_dt(购买日期),supply(供应天数)每个项目)。

id <- c(1,1,1,1,2,2,2,2,2)
item <- c("a","b","b","c","a","e","f","c","d")
purchase_dt <- c("2000-01-01","2000-01-15","2000-03-15","2000-04-01",
                 "2001-05-01","2001-05-15","2001-05-25","2001-06-20","2001-07-05")
supply <- c(20,10,30,20,30,30,30,20,20)

df <- data.frame(id,item,purchase_dt,supply)
df$purchase_dt <- as.Date(df$purchase_dt)

我想做的是找到在个人层面一起消费的项目组合。为此,需要同时使用 purchase_dtsupply 并检查是否发生重叠。

使用这个数据集,对于id=1,我们可以看到"a"和"b"一起被消耗,"b"和"c"被一起消耗掉了。这是原因。

第一件商品 ("a") 是在 2000-01-01 购买的,一直持续到 2000-01-20(加上 20 天供应量减去 1 之后)。我减去 1,因为我们包括了第一天。

第二件商品 ("b") 于 2000-01-15 购买,一直持续到 2000-01-24。所以“a”和“b”都可以合并。

相同的逻辑适用于其余数据。请注意,有时我们会重叠两个以上的产品,正如我们在 id=2.

中看到的那样

这是我希望生成的输出文件:

奖金:我想知道这是否可以在 dplyr 中完成,而且越快越好。

首先,我不太了解您的预期输出。对于 id = 2purchase_dtall 条目中的前一个 purchase_dt + supply - 1 之间存在重叠。那么按照你的规定,不应该全部合并吗?


假设你错了id = 2,你可以进行以下操作

library(tidyverse)
df %>%
    group_by(id) %>%
    mutate(grp = cumsum(
        purchase_dt > lag(purchase_dt + supply - 1, default = first(purchase_dt)))) %>%
    group_by(id, grp) %>%
    summarise(comb = toString(unique(item))) %>%
    select(-grp) %>%
    ungroup()
## A tibble: 3 x 2
#     id comb
#  <dbl> <chr>
#1     1 a, b
#2     1 b, c
#3     2 a, e, f, c, d

说明:我们按 id 分组,根据 purchase_dt 和之前的 purchase_dt + supply - 1 之间的日期重叠创建组标签,然后通过 idgrp