2016-06-10 7 views
9

Verwenden Sie als Beispiel den Datensatz mpg, insbesondere die Spalten class und cyl. Ich kann sehen, wie viele Einträge gibt es pro Einzel class und differenzieren die Farbfüllung auf dem CYL-Wert basiert:Aggregieren von Daten mit ggplot

library(ggplot2) 
p <- ggplot(mpg) 
p <- p + geom_bar(mapping=aes(x=class, fill=factor(cyl)), position=position_dodge()) 
print(p) 

enter image description here

Was ich möchte, ist allerdings sehen, die Durchschnitt Anzahl der Einträge (pro class), nach verschiedenen Werten von cyl. Wenn Sie sich das obige Diagramm ansehen, möchte ich einen einzelnen Balken pro Klasse, dessen Höhe die durchschnittliche Höhe der farbigen Balken für diese Klasse sein sollte.

Ich bin in der Lage, dieses Ergebnis zu erhalten, indem den Datenrahmen Vorverarbeitung, zB:

df <- aggregate(formula=cyl~class, data=mpg, FUN=function(x) { length(x)/length(unique(x)) }) 
p <- ggplot(df) 
p <- p + geom_bar(mapping=aes(x=class, y=cyl), stat='identity') 
p <- p + ylab('average count') 

Das gibt meinen gewünschten Ausgang:

enter image description here

Angesichts der Tatsache, wie stark ggplot2 ist Ich frage mich, ob dies durch ggplot-Funktionen möglich ist. Ich denke, das beinhaltet die Verwendung einer bestimmten stat (vielleicht mit group=cyl?), Aber ich bin nicht in der Lage.

+0

einen Blick Geben Sie auf 'stat_summary' [link] (http: //docs.ggplot2 .org/current/stat_summary.html) – user3631369

+0

@ user3631369 Ich spiele gerade damit, aber ich bekomme keine Ergebnisse. Ich kann nicht über das Zylinderfeld aggregieren. – natario

Antwort

13

Wir Ihre Formel direkt in stat_summary() Stecker kann das gewünschte Ergebnis ohne Zwischenschritte zu generieren:

library(ggplot2) 
ggplot(mpg) + 
    stat_summary(aes(x = class, y = cyl), 
       fun.y = function(x) length(x)/length(unique(x)), 
       geom = "bar") 

enter image description here

+0

gibt es eine Möglichkeit, 'fun.y' eine Aggregationsfunktion zu übergeben, die auf anderen Variablen im data.frame basiert? (So ​​dass ich in jeder Gruppe eine Summe berechnen kann - irgendwie konnte ich das nicht zur Arbeit bringen ...) –

+0

Kannst du ein Beispiel geben? Vielleicht eine neue Frage stellen – mtoto