2012-03-23 10 views
30

Ich versuche, mehrere Zusammenfassung Statistiken in R-plus/S plus nach kategorischen Spalte in einem Schuss gruppiert. Ich habe ein paar Funktionen gefunden, aber alle führen eine Statistik pro Aufruf aus, wie Aggregat.Wie bekomme ich die Zusammenfassung Statistiken nach Gruppe

data <- c(62, 60, 63, 59, 63, 67, 71, 64, 65, 66, 68, 66, 71, 67, 68, 68, 56, 62, 60, 61, 63, 64, 63, 59) 
grp <- factor(rep(LETTERS[1:4], c(4,6,6,8))) 
df <- data.frame(group=grp, dt=data) 
mg <- aggregate(df$dt, by=df$group, FUN=mean)  
mg <- aggregate(df$dt, by=df$group, FUN=sum)  

Was ich suche ist mehrere Statistiken für die gleiche Gruppe wie Mittelwert, min, max, std, ... etc in einem Aufruf zu bekommen, ist, dass machbar?

+2

Dieser ist eine ziemlich einfache Frage mit mehreren Antworten. Sie sind möglicherweise nicht vertraut mit RSeek [(LINK)] (http://www.rseek.org/) und der SOS-Bibliothek [(LINK)] (http://cran.r-project.org/web/packages/ sos/index.html) Beide sind großartige Hilfsmittel, um Ihnen zu helfen, Antworten auf Fragen zu finden. Ibet mit diesen Ressourcen können Sie Ihre eigene Frage in Sekunden beantworten. –

+0

Es gibt ein zusätzliches Komma am Ende der 'Daten <- c (' Zeile. – BenBarnes

Antwort

9

werfen Sie einen Blick auf das plyr Paket. Insbesondere ddply

ddply(df, .(group), summarise, mean=mean(dt), sum=sum(dt)) 
0

Erstens hängt es von Ihrer Version von R. Wenn Sie 2.11 bestanden haben, können Sie mehrere Ergebnisse Funktionen (Zusammenfassung, durch eine Instanz oder eine eigene Funktion) verwenden aggreggate mit. Wenn nicht, können Sie die Antwort von Justin verwenden.

9

Es gibt viele verschiedene Möglichkeiten, um dies zu realisieren, aber ich bin teilweise zu describeBy im psych Paket:

describeBy(df$dt, df$group, mat = TRUE) 
62

ich in meinem zwei Cent für tapply() gestellt werden.

tapply(df$dt, df$group, summary) 

Sie können eine benutzerdefinierte Funktion mit den spezifischen Statistiken, die Sie Zusammenfassung ersetzen möchten schreiben.

+0

Wie kann ich die Ergebnisse im wissenschaftlichen Format bekommen? – maximusyoda

+0

@maximusyoda, um wissenschaftliche Notation zu erhalten, verwenden Sie eine benutzerdefinierte Funktion anstelle von 'Zusammenfassung' wie:' tapply (df $ dt, df $ Gruppe, Funktion (x) -Format (Zusammenfassung (x), wissenschaftliche = TRUE) ' – BenBarnes

3

Neben describeBy ist das doBy Paket eine weitere Option. Es bietet einen Großteil der Funktionalität von SAS PROC SUMMARY. Details: http://www.statmethods.net/stats/descriptives.html

+0

Eine weitere schnelle Möglichkeit, Daten zu tabellieren (ohne beschreibende Statistiken), ist die 'freq' -Funktion im' descr'-Paket. Das ist nicht genau das, wonach Sie gefragt haben, aber trotzdem lehrreich sein kann. Details: http://www.rdocumentation.org/packages/descr/functions/freq – dwstu

2

Ich habe gerade ein wunderbares R-Paket tables gefunden. Sie können Daten nach beliebig vielen Kategorien tabellarisch darstellen und mehrere Statistiken für mehrere Variablen berechnen - das ist wirklich erstaunlich!

Aber warten Sie, es gibt mehr! Das Paket enthält Funktionen zum Generieren von LaTeX-Code für Ihre Tabellen zum einfachen Import in Ihre Dokumente.

22

dplyr Paket könnte schöne Alternative zu diesem Problem:

library('dplyr') 
df %>% group_by(group) %>% summarize(mean=mean(dt), sum=sum(dt)) 
+0

Wir können nicht erhalten erste Quadrant und dritten Quadranten Informationen mit dplyr –

+4

Ja, Sie können - DF%>% group_by (Gruppe)%>% zusammenfassen (q1 = Quantil (dt, 0,25), q3 = Quantil (dt, 0,75)) –

6

Mit Hadley purrr Paket Wickham das ist ganz einfach. Verwenden Sie split, um die übergebenen data_frame in Gruppen aufzuteilen, und verwenden Sie dann map, um die Funktion summary auf jede Gruppe anzuwenden.

library(purrr) 

df %>% split(.$group) %>% map(summary) 
+0

df%>% group_by (Gruppe)%>% do (data.frame (summary (.))) sollte etwas ähnliches in dplyr tun – AlexR

+0

Dies scheint die gleiche Ausgabe zu erzeugen wie der "tapply" -Ansatz unter Verwendung der Basis R. – dsaxton

1

nach 5 langen Jahren sicher, ich bin nicht viel Aufmerksamkeit für diese Antwort empfangen werden wird, aber immer noch alle Optionen abgeschlossen ist, hier zu machen ist das mit data.table

library(data.table) 
setDT(df)[ , list(mean_gr = mean(dt), sum_gr = sum(dt)) , by = .(group)] 
# group mean_gr sum_gr 
#1:  A  61 244 
#2:  B  66 396 
#3:  C  68 408 
#4:  D  61 488