簡體   English   中英

dplyr min在特定值上

[英]dplyr min on specific values

我想使用dplyr在R中進行以下SQL查詢的等效dplyr

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(產品)上的原始數據框。

就像@ luis-usier建議的那樣,您應該(同樣在您的sql中)按用戶和產品進行分組:

圖書館(dplyr)

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")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM