[英]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.