2016-07-21 8 views
0

Ich möchte das Äquivalent der folgenden SQL Abfrage in R zu tun mit dplyr:dplyr min auf bestimmte Werte

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; 

Ich glaube, ich müsste die min() Funktion in Kombination verwenden, um mit which() (siehe Vorschlag unten) aber die Syntax ist falsch und ich weiß nicht, wie man diese zwei Funktionen kombiniert!

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

Wenn es einen Weg gibt es für alle bestehenden Produkte zu tun, anstatt in einer mutieren Aussage eins nach dem anderen die Produkte der Auflistung, ich bin glücklich, zu wissen, wie es zu tun.

+0

Willkommen bei Stackoverflow. Bitte geben Sie ein [MCVE] –

Antwort

0

Die Idee dabei ist, sowohl zu einer Gruppe von Benutzern und Produkt:

min_purchase_dates_per_product <- 
    fact_purchase %>% 
    group_by(user_id, product) %>% 
    summarize(min(x)) 

Ich habe x als die Variable, dessen Minimum, das wir versuchen zu finden.

Sie können später kommen diese auf den ursprünglichen Datenrahmen auf user_id, Produkt, falls erforderlich.

0

Wie @ luis-usier vorgeschlagen, sollten Sie (auch in der SQL) Gruppe durch den Benutzer und Produkt:

Bibliothek (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)) 

als solche Ihre Daten ordentlich bleibt! Wenn Sie wirklich Ihre Daten in eine Matrix von Variablen müssen zu transformieren, dann können Sie tidyr verwenden:

productTable %>% 
    group_by(user, product) %>% 
    summarise(minPurchase = min(purchaseDate)) %>% 
    tidyr::spread(key = "product", value = "minPurchase")