最终,我希望将数据中的金额列聚合到尚不存在但由两个现有组和时间差维度组成的模块化组上。
我有一个结构如下的数据集:
data <- tibble(
date = as.POSIXct(c('2023-07-01 12:00:00', '2023-07-01 13:00:00', '2023-07-02 12:00:00',
'2023-07-03 14:00:00', '2023-07-03 16:00:00', '2023-07-04 12:00:00', '2023-07-04 14:00:00',
'2023-07-05 10:00:00', '2023-07-05 12:00:00')),
transaction_id = c(1, 1, 2, 3, 3, 4, 4, 5, 5),
seller_ID = c(201, 202, 201, 201, 204, 205, 206, 201, 207),
amount = c(100, 150, 200, 300, 350, 400, 450, 500, 550),
)
我想添加一个时间差,即卖家 ID 出现与其上一次出现之间的持续时间。
ordered_data <- data %>%
group_by(seller_ID) %>%
arrange(seller_ID, date) %>%
mutate(time_diff_hours = as.numeric(difftime(date, lag(date, default = first(date)), units = "hours"))) %>%
ungroup()
从概念上讲,还有一些后续步骤(这就是我正在努力的地方):
首先,我想将所有 transactionID 分组在一起,而不管 seller_ID 是什么(因此所有 transaction_ID 1 行都应该聚合在一起)。但是,如果这些 sellerID 出现在该 sellerID 之前(滞后)出现的 24 小时(含)内,我还想在此聚合中包含重复的 sellerID。因此,在示例数据中,所有 transactionID 1 均按 transactionID 聚合在一起,但包含 sellerID 201 的 transactionID2 也包含在聚合中,因为它发生在作为 transactionID1 一部分的 sellerID 201 首次出现后的 24 秒内。换句话说,仅仅通过 transactionID 聚合是不够的。
但是,如果 sellerID 与之前的出现相距太远,我也不想将其包含在聚合中。例如,sellerID 201 的另外两个实例(transactionID 3 和 5)不与交易 ID 1 一起计数,因为它们发生在上一次出现 sellerID 201 之后太久(>24 小时),并且出于相同的原因也不会集中在一起.
简而言之,我有组、transactionID 和 sellerID,但有时我想根据 sellerID 之间的时间关系将 transactionID 组合在一起。
理想的群体应该是这样的:
ordered_data <- ordered_data %>%
mutate(ideal_groups = c(1,1,2,3,1,2,4,4,3))
ordered_data |>
mutate(groups = ifelse(!is.na(lag(date)) & date - lag(date) <= hours(24), lag(transaction_id), transaction_id), .by = seller_ID)|>
mutate(groups = match(groups, unique(groups)))
输出:
# A tibble: 9 × 7
date transaction_id seller_ID amount time_diff_hours
<dttm> <dbl> <dbl> <dbl> <dbl>
1 2023-07-01 12:00:00 1 201 100 0
2 2023-07-02 12:00:00 2 201 200 24
3 2023-07-03 14:00:00 3 201 300 26
4 2023-07-05 10:00:00 5 201 500 44
5 2023-07-01 13:00:00 1 202 150 0
6 2023-07-03 16:00:00 3 204 350 0
7 2023-07-04 12:00:00 4 205 400 0
8 2023-07-04 14:00:00 4 206 450 0
9 2023-07-05 12:00:00 5 207 550 0
ideal_groups groups
<dbl> <int>
1 1 1
2 1 1
3 2 2
4 3 3
5 1 1
6 2 2
7 4 4
8 4 4
9 3 3