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?


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.


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

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)

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) 

12

Schauen Sie sich das plyrPaket an. Speziell,ddply

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

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 


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

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.


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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.