2014-02-12 5 views
6

Hier ist ein einfaches Beispiel, das Problem zu veranschaulichen:kann ich die Gruppierungsvariable in einer einzigen dplyr-Anweisung wechseln?

library(data.table) 
dt = data.table(a = c(1,1,2,2), b = 1:2) 

dt[, c := cumsum(a), by = b][, d := cumsum(a), by = c] 
# a b c d 
#1: 1 1 1 1 
#2: 1 2 1 2 
#3: 2 1 3 2 
#4: 2 2 3 4 

Der Versuch, das gleiche in dplyr ich nicht tun, weil die erste group_by persistent ist und die Gruppierung ist sowohl b und c:

df = data.frame(a = c(1,1,2,2), b = 1:2) 

df %.% group_by(b) %.% mutate(c = cumsum(a)) %.% 
     group_by(c) %.% mutate(d = cumsum(a)) 
# a b c d 
#1 1 1 1 1 
#2 1 2 1 1 
#3 2 1 3 2 
#4 2 2 3 2 

Ist das ein Fehler oder eine Funktion? Wenn es sich um ein Feature handelt, wie würde man dann die data.table Lösung in einer einzigen Anweisung replizieren?

+1

Tatsächlich wird der Code mit den neueren 'dplyr' Versionen korrekt funktionieren, da' dplyr' den Aggregationslevel für jede 'muate' /' summarise' Operation abbricht. –

Antwort

7

Try this:

> df %>% group_by(b) %>% mutate(c = cumsum(a)) %>% 
+  group_by(c) %>% mutate(d = cumsum(a)) 
Source: local data frame [4 x 4] 
Groups: c 

    a b c d 
1 1 1 1 1 
2 1 2 1 2 
3 2 1 3 2 
4 2 2 3 4 

aktualisieren

Bei neueren Version von dplyr Verwendung %>% statt %.% und ungroup nicht mehr benötigt wird (nach David Arenburg Kommentar).

+0

danke, eine seitwärts verwandte Frage - jede Idee, warum 'df%.% Group_by (b)%.% Zusammenfassen (cumsum (a))' funktioniert nicht (und wie man das macht)? – eddi

+1

Verwenden Sie muate wie folgt: 'df%.% Group_by (b)%.% Mutieren (cumsum = cumsum (a))' –

+0

danke, ich denke, ein besseres Beispiel für das Problem ist, wie würde man 'dt [replizieren] rep (a, 3), durch = b] '? – eddi

Verwandte Themen