So erhalten Sie zusammenfassende Statistiken nach Gruppen

73

Ich versuche, mehrere zusammenfassende Statistiken in R / S-PLUS in einer Aufnahme nach kategorialen Spalten zu gruppieren. Ich habe einige Funktionen gefunden, aber alle führen eine Statistik pro Aufruf aus, z. B. `aggregat ().

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 dieselbe Gruppe wie Mittelwert, Min, Max, Standard, ... usw. in einem Anruf zu erhalten. Ist das machbar?

user1289220
quelle
2
Dies ist eine ziemlich einfache Frage mit mehreren Antworten. Möglicherweise sind Sie mit RSeek (LINK) und der sos-Bibliothek (LINK) nicht vertraut. Beide sind hervorragende Ressourcen, um Antworten auf Fragen zu finden. Mit diesen Ressourcen können Sie Ihre eigene Frage in Sekundenschnelle beantworten.
Tyler Rinker
Am Ende der data <- c(Zeile steht ein zusätzliches Komma .
BenBarnes
Ich habe gerade einen wunderbaren R-Paket- Tisch gefunden . Sie können Daten nach beliebig vielen Kategorien tabellieren und mehrere Statistiken für mehrere Variablen berechnen - es ist wirklich erstaunlich! Aber warte, da ist noch mehr! Das Paket verfügt über Funktionen zum Generieren von LaTeX-Code für Ihre Tabellen für den einfachen Import in Ihre Dokumente.
StatGrrl

Antworten:

106

Ich werde meine zwei Cent für setzen tapply().

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

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

BenBarnes
quelle
1
@ Maximusyoda, um wissenschaftliche Notation zu erhalten, verwenden Sie eine benutzerdefinierte Funktion anstelle von summary:tapply(df$dt, df$group, function(x) format(summary(x), scientific = TRUE))
BenBarnes
45

Das dplyr- Paket könnte eine gute Alternative zu diesem Problem sein:

library(dplyr)

df %>% 
  group_by(group) %>% 
  summarize(mean = mean(dt),
            sum = sum(dt))

1. Quadrant und 3. Quadrant erhalten

df %>% 
  group_by(group) %>% 
  summarize(q1 = quantile(dt, 0.25),
            q3 = quantile(dt, 0.75))
Jot eN
quelle
33

Mit Hadley Wickhams Purrr-Paket ist dies ganz einfach. Verwenden Sie splitdiese Option , um die übergebenen data_frameGruppen aufzuteilen , und mapwenden Sie dann die summaryFunktion auf jede Gruppe an.

library(purrr)

df %>% split(.$group) %>% map(summary)
conor
quelle
2
df%>% group_by (group)%>% do (data.frame (summary (.))) sollte in dplyr
AlexR
1
Dies scheint eine identische Ausgabe zu erzeugen wie der tapplyAnsatz unter Verwendung der Basis R.
dsaxton
17

Es gibt viele verschiedene Möglichkeiten, dies zu tun, aber ich bin Teil describeBydes psychPakets:

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

quelle
12

Schauen Sie sich das plyrPaket an. Speziell,ddply

ddply(df, .(group), summarise, mean=mean(dt), sum=sum(dt))
Justin
quelle
7

Nach 5 langen Jahren werde ich sicher nicht viel Aufmerksamkeit für diese Antwort erhalten, aber um alle Optionen zu vervollständigen, hier ist die 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 
joel.wilson
quelle
3

Während einige der anderen Ansätze funktionieren, entspricht dies ziemlich genau dem, was Sie getan haben, und verwendet nur Basis r. Wenn Sie den Aggregatbefehl kennen, ist dies möglicherweise intuitiver.

with( df , aggregate( dt , by=list(group) , FUN=summary)  )
MatthewR
quelle
2

Das psychPaket bietet eine großartige Option für gruppierte Zusammenfassungsstatistiken:

library(psych)
    
describeBy(dt, group="grp")

erzeugt viele nützliche Statistiken, einschließlich Mittelwert, Median, Bereich, SD, SE.

FGP
quelle
1

Erstens hängt es von Ihrer Version von R ab. Wenn Sie 2.11 bestanden haben, können Sie aggreggate mit mehreren Ergebnisfunktionen (Zusammenfassung, nach Instanz oder Ihrer eigenen Funktion) verwenden. Wenn nicht, können Sie die Antwort von Justin verwenden.

CPHM
quelle