当日期在 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_dt
和 supply
并检查是否发生重叠。
使用这个数据集,对于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 = 2
,purchase_dt
与 all 条目中的前一个 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
之间的日期重叠创建组标签,然后通过 id
和 grp
。
以下数据包含四列: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_dt
和 supply
并检查是否发生重叠。
使用这个数据集,对于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 = 2
,purchase_dt
与 all 条目中的前一个 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
之间的日期重叠创建组标签,然后通过 id
和 grp
。