2015-04-23 6 views
5

Ich hatte heute ein Problem, einen Weg zu finden, eine Aggregation in dplyr in R zu machen, aber aus irgendeinem Grund konnte ich keine Lösung finden (obwohl ich denke, das sollte sei ganz einfach).Mehrere Aggregationen (kategorisch und numerisch) mit dplyr in einer Kette

Ich habe einen Datensatz wie folgt aus:

structure(list(date = structure(c(16431, 16431, 16431, 16432, 
16432, 16432, 16433, 16433, 16433), class = "Date"), colour = structure(c(3L, 
1L, 1L, 2L, 2L, 3L, 3L, 1L, 1L), .Label = c("blue", "green", 
"red"), class = "factor"), shape = structure(c(2L, 2L, 3L, 3L, 
3L, 2L, 1L, 1L, 1L), .Label = c("circle", "square", "triangle" 
), class = "factor"), value = c(100, 130, 100, 180, 125, 190, 
120, 100, 140)), .Names = c("date", "colour", "shape", "value" 
), row.names = c(NA, -9L), class = "data.frame") 

die wie folgt zeigt:

 date colour shape value 
1 2014-12-27 red square 100 
2 2014-12-27 blue square 130 
3 2014-12-27 blue triangle 100 
4 2014-12-28 green triangle 180 
5 2014-12-28 green triangle 125 
6 2014-12-28 red square 190 
7 2014-12-29 red circle 120 
8 2014-12-29 blue circle 100 
9 2014-12-29 blue circle 140 

Mein Ziel ist die häufigste Farbe, Form und den Mittelwert pro Tag zu berechnen. Meine erwartete Ausgabe ist die folgende:

 date colour shape value 
1 27/12/2014 blue square 110 
2 28/12/2014 green triangle 165 
3 29/12/2014 blue circle 120 

ich es split tun landete mit und schreibt meine eigene Funktion, die für ein noch data.frame zu berechnen, verwenden dann snow::clusterApply es parallel laufen zu lassen. Es war effizient genug (meine ursprüngliche Datenmenge ist etwa 10M Zeilen lang), aber ich frage mich, ob dies in eine Kette mit dplyr passieren kann. Die Effizienz ist sehr wichtig, deshalb ist es sehr wichtig, sie in einer Kette zu betreiben.

+0

Haben Sie versucht, mit 'group_by' und' summarize'? [Dieser Ansatz] (http://stackoverflow.com/questions/18433647/how-to-get-the-most-frequen-level-of-a-categorical-variable-in-r) könnte die allgemeinste Ebene erhalten. –

Antwort

7

könnten Sie

tun
dat %>% group_by(date) %>% 
    summarize(colour = names(which.max(table(colour))), 
       shape = names(which.max(table(shape))), 
       value = mean(value)) 
+0

Ich wusste, dass ich den langen Weg mit 'Split' +' ClusterApply' genommen habe! Danke vielmals! Dies ist, was ich gesucht habe und ich war verwirrt, wie man die Funktionen, die man benötigt, mit 'summarize 'kombiniert. Danke noch einmal!! – LyzandeR

+1

@LyzandeR sehr glücklich zu helfen! –

Verwandte Themen