2016-08-08 16 views
1

Ich habe eine Datenbank (user_reg), die Kunden Informationen (customer_id), deren Anmeldetag (reg_date2) und das Datum ihrer Aufträge (order_date2, oft> 1 pro Kunde).dplyr :: group_by verlässt Variablen ungruppierten

Ich mag 1) wissen, wann der erste Auftrag stattfand und dann 2) am Ende mit einem tbl mit einzigartigen user_id, reg_date2 und first_order.

Nach dem Ausführen des Codes unter

user_reg %>% select(user_id, reg_date2, order_date2) %>% 
    group_by(user_id) %>% 
    mutate(first_order=min(order_date2)) %>% 
    select(user_id, reg_date2, first_order) %>% 
    arrange(user_id) %>% 
    group_by(user_id) 

ich immer noch mehrere Zeilen pro user_id.

user_id reg_date2 first_order 
    <int>  <date>  <date> 
1  -1 2015-11-03 2015-11-25 
2  1 2013-10-24 2014-10-11 
3  1 2013-10-24 2014-10-11 
4  1 2013-10-24 2014-10-11 
5  1 2013-10-24 2014-10-11 
6  1 2013-10-24 2014-10-11 

Irgendwelche Ideen, wie man es beheben kann?

+0

Klingt wie ein Job:

... %>% group_by(user_id, reg_date2) %>% summarise(first_order = min(order_date2)) 

Alternativ (aber mit mehr Typisierung), reg_date2 halten kann, indem es in summarise getan werden? – aosmith

+0

mein Ziel ist es, eine Tabelle mit allen genannten Variablen zu haben, summarize() gibt mir nur user_id und first_order. Außerdem, selbst wenn ich versuche, mehrere Datenrahmen zu erstellen, jede mit user_id und einer Variablen von Interesse, und dann sie zusammenzufügen, habe ich immer noch mehrere Einträge pro user_id –

+1

Nun, 'muate' wird immer die gleiche Anzahl von zurückgeben Zeilen als das ursprüngliche Dataset. In diesem einfachen Fall wäre es einfach, Ihre zusätzliche Spalte beizubehalten, indem Sie 'reg_date2' als Gruppierungsvariable verwenden oder sie in' summarize' einschließen (zB 'reg_date2 = unique (reg_date2'). Wenn Sie' muate' bevorzugen), Dann brauchst du etwas wie "distinct" nach. – aosmith

Antwort

4

Die Funktion mutate fügt dem vorhandenen Dataset Variablen hinzu, sodass Sie immer die gleiche Anzahl an Zeilen erhalten, mit denen Sie begonnen haben.

Sie können die Funktion distinct hinzufügen, um nur eine einzige eindeutige Zeile pro ID beizubehalten. Um alle anderen Variablen zu behalten, benötigen Sie das Argument .keep_all.

... %>% 
    group_by(user_id) %>% 
    mutate(first_order = min(order_date2)) %>% 
    distinct(first_order, .keep_all = TRUE) 

Wenn man von vielen Zeilen zu einer einzigen Zeile pro-ID ist oft ein für summarise, obwohl dies die anderen Variablen sinken. Wenn der reale Anwendungsfall so einfach ist, kann die zusätzliche Variable als eine Gruppierungsvariable enthalten sein, da reg_date2 eindeutig zu sein scheint unter user_id.

für `summarize` statt` mutate`
... %>% 
group_by(user_id) %>% 
    summarise(reg_date2 = unique(reg_date2), 
       first_order = min(order_date2)) 
Verwandte Themen