Ich habe R Datenrahmen wie folgt:
age group
1 23.0883 1
2 25.8344 1
3 29.4648 1
4 32.7858 2
5 33.6372 1
6 34.9350 1
7 35.2115 2
8 35.2115 2
9 35.2115 2
10 36.7803 1
...
Ich muss den Datenrahmen in der folgenden Form erhalten:
group mean sd
1 34.5 5.6
2 32.3 4.2
...
Die Gruppennummer kann variieren, aber ihre Namen und Anzahl können durch einen Anruf erhalten werden levels(factor(data$group))
Welche Manipulationen sollten mit den Daten durchgeführt werden, um das Ergebnis zu erhalten?
r
data-transformation
Yuriy Petrovskiy
quelle
quelle
aggregate
,tapply
und dann stackoverflow.com für nachfolgende Codierung Fragen dieser Art.Antworten:
Hier ist die plyr eine Zeile Variante ddply :
Hier ist eine weitere einzeilige Variante mit der neuen Paketdatei data.table .
Dieser ist schneller, obwohl dies nur bei Tabellen mit 100.000 Zeilen auffällt. Timings auf meinem Macbook Pro mit 2.53 Ghz Core 2 Duo Prozessor und R 2.11.1:
Weitere Einsparungen sind möglich, wenn wir verwenden
setkey
:quelle
dt <- data.table(dtf)
stattdt <- data.table(dt)
im zweiten Codeblock. Auf diese Weise erstellen Sie die Datentabelle aus einem Datenrahmen anstelle derdt
Funktion aus demstats
Paket. Ich habe versucht, es zu bearbeiten, aber ich kann keine Änderungen unter sechs Zeichen vornehmen.data.table
ist der beste Weg, Daten zu aggregieren, und diese Antwort ist großartig, kratzt aber immer noch nur die Oberfläche. Es ist nicht nur syntaktisch überlegen, sondern auch äußerst flexibel und verfügt über viele erweiterte Funktionen, die Verknüpfungen und interne Mechanismen umfassen. Weitere Informationen finden Sie in den FAQ, auf der Github-Seite oder im Kurs.Eine Möglichkeit ist die Verwendung der Aggregatfunktion . Zum Beispiel,
gibt Ihnen die zweite Spalte des gewünschten Ergebnisses.
quelle
data.frame(group=levels(factor(data$group)),mean=(aggregate(data$age, by=list(data$group), FUN=mean)$x),sd=(aggregate(data$age, by=list(data$group), FUN=sd)$x))
Ich habe die Sache telefonisch erledigt , aber ich bin nicht sicher, ob es der richtige Weg ist. Ich bin nicht sicher, was passieren wird, wenn die Ergebnisse der gebundenen Spalten in einer anderen Reihenfolge vorliegen (ich denke, es ist möglich). Was ist Ihre Meinung?aggregate()
:aggregate(age ~ group, data=dat, FUN = function(x) c(M=mean(x), SD=sd(x)))
Da Sie einen Datenrahmen bearbeiten, ist das
dplyr
Paket wahrscheinlich der schnellste Weg, dies zu tun.oder gleichwertig mit dem Operator
dplyr
/magrittr
pipe:BEARBEITEN Sie die vollständige Verwendung des Pipe-Operators:
quelle
dplyr
. Es hat so viele R-Aufgaben einfach und viele dieser Methoden überholt.plyr
anstattdplyr
das Problem zu verursachen.Toll, danke bquast für das Hinzufügen der Dplyr-Lösung!
Es stellt sich heraus, dass dplyr und data.table sehr nahe beieinander liegen:
data.table ist immer noch die schnellste, gefolgt von dplyr (), die auf dem data.frame interessanterweise schneller zu sein scheint als die data.table:
quelle
Zusätzlich zu vorhandenen Vorschlägen möchten Sie möglicherweise die
describe.by
Funktion impsych
Paket überprüfen .Es bietet eine Reihe von beschreibenden Statistiken, einschließlich des Mittelwerts und der Standardabweichung basierend auf einer Gruppierungsvariablen.
quelle
Ich habe festgestellt, dass die Funktion
summaryBy
im doBy-Paket hierfür am bequemsten ist:quelle
Verwenden Sie das
sqldf
Paket. Auf diese Weise können Sie jetzt SQL verwenden, um die Daten zusammenzufassen. Sobald Sie es geladen haben, können Sie Folgendes schreiben:quelle
Bearbeitet: Nach den Vorschlägen von chl
Die gesuchte Funktion heißt "tapply" und wendet eine Funktion pro Gruppe an, die durch einen Faktor angegeben wird.
Ich empfehle dringend, ein grundlegendes R-Tutorial durchzuarbeiten, in dem alle gängigen Datenstrukturen und Methoden erläutert werden. Andernfalls stecken Sie bei der Programmierung jeden Zentimeter fest. In dieser Frage finden Sie eine Sammlung frei verfügbarer Ressourcen.
quelle
for
Schleife erforderlich. Sie können Ihren Datenrahmen inline konstruieren, IMO.tapply
Verwenden Sie für den Aufruffunction(x) c(mean(x),sd(x)))
undcbind
das Ergebnis als OP, um beide Statistiken anzufordern . Auchddply
aus dem Plyr- Paket könnte dies reibungslos funktionieren.cbind("mean"=mperage,"stdev"=stperage) gives no 'group' column. Will be joining by
cbind (group = levels (factor (data $ group)), "mean" = mperage, "stdev" = stperage) `richtig?Hier ist ein Beispiel mit der Funktion,
aggregates()
die ich vor einiger Zeit selbst gemacht habe:Es ergibt sich folgendes Ergebnis:
Vielleicht können Sie das gleiche Ergebnis ausgehend von der R-Funktion split () erhalten:
Lassen Sie mich noch einmal auf die Ausgabe der
aggregates
Funktion zurückkommen . Sie können es in einem schönen Tisch - Transformationreshape()
,xtabs()
undftable()
:Das gibt:
Schön, nicht wahr? Sie können diese Tabelle mit der
textplot()
Funktion desgplots
Pakets in ein PDF exportieren .Sehen Sie hier für andere Lösungen.
quelle