我想用dplyr
:在R中执行以下等效的SQL
查询
SELECT
user_id,
min(case when product = 'ProductA' then purchase_date end) AS min_purchase_date_product_A,
min(case when product = 'ProductB' then purchase_date end) AS min_purchase_date_product_B
FROM fact_purchase
GROUP BY user_id;
我想我需要将min()
函数与which()
结合使用(见下面的建议),但语法错误,我不知道如何将这两个函数结合使用!
min_purchase_dates_per_product =
fact_purchase %>%
group_by(user_id) %>%
mutate(
min_purchase_date_product_A = min(which(product == 'ProductA')),
min_purchase_date_product_B = min(which(product == 'ProductB'))
)
如果有一种方法可以为所有现有的产品做这件事,而不是在mutate语句中逐一列出产品,我很高兴知道如何做。
这里的想法是按用户和产品进行分组:
min_purchase_dates_per_product <-
fact_purchase %>%
group_by(user_id, product) %>%
summarize(min(x))
我把x
作为我们试图找到的最小值的变量。
您可以稍后将其加入user_id上的原始数据帧,如有必要,请使用product。
Like@luis-usier建议您应该(也在sql中)按用户和产品分组:
库
productTable <- data.frame(user = sample(1:2, size = 10, replace = T),
product = paste0("p", sample(1:2, size = 10, replace = T)),
purchaseDate = sample(seq(as.Date('2016/01/01'), as.Date('2016/07/01'), by="day"), 10))
productTable
productTable %>%
group_by(user, product) %>%
summarise(minPurchase = min(purchaseDate))
因此,您的数据保持整洁!如果您真的需要将数据转换为变量矩阵,那么您可以使用tidyr
:
productTable %>%
group_by(user, product) %>%
summarise(minPurchase = min(purchaseDate)) %>%
tidyr::spread(key = "product", value = "minPurchase")