2016-06-10 15 views
9

Jako przykład podajemy zestaw danych mpg, w szczególności kolumny class i cyl. Widzę ile wpisy są tam na jedną class, i odróżnić kolor wypełnienia na podstawie wartości cyl:Dane zagregowane za pomocą 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

Co chciałbym zobaczyć, chociaż, to średnia liczba wpisów (za class), według różnych wartości cyl. Zasadniczo, jeśli spojrzysz na powyższy wykres, chcę mieć pojedynczy słupek na klasę, którego wysokość powinna być średnią wysokością kolorowych pasków dla tej klasy.

jestem w stanie uzyskać ten wynik przez przerób ramkę danych, np:

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

Daje moje pożądany wynik:

enter image description here

Jednak biorąc pod uwagę, jak potężny ggplot2 jest , Zastanawiam się, czy jest to możliwe dzięki funkcjom ggplota. Myślę, że to wymaga użycia specyficznego stat (może z group=cyl?), Ale nie jestem w stanie.

+0

Daj obejrzenia 'stat_summary' [związek] (http: //docs.ggplot2 .org/current/stat_summary.html) – user3631369

+0

@ user3631369 Gram z tym teraz, ale nie osiągam rezultatów. Nie mogę agregować na polu cyl. – natario

Odpowiedz

13

Możemy podłączyć wzór prosto stat_summary() do wytworzenia pożądanego efektu, bez etapów pośrednich:

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

jest sposobem na przekazanie fun.y' funkcji agregacji, która jest oparta na innych zmiennych w data.frame? (Tak, żebym mógł obliczyć sumę w każdej grupie - w jakiś sposób nie mogłem tego uruchomić ...) –

+0

Czy mógłbyś podać przykład? Być może zadaj nowe pytania – mtoto

Powiązane problemy