dplyr min on specific values



我想用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")

最新更新