Diese Frage hat mehrere Antworten, aufgrund der Flexibilität der Pakete 'reshape2' und 'plyr'. Ich werde zeigen, eine der einfachsten Beispiele zu verstehen, hier:
library(reshape2)
library(plyr)
aqm <- melt(airquality, id=c("Month", "Day"), na.rm=TRUE)
aqm_ply <- ddply(aqm, .(Month, variable), summarize, min=min(value), max=max(value))
aqm_melt <- melt(aqm_ply, id=c("Month", "variable"), variable.name="variable2")
dcast(aqm_melt, Month ~ variable + variable2)
# Month Ozone_min Ozone_max Solar.R_min Solar.R_max Wind_min Wind_max Temp_min Temp_max
# 1 5 1 115 8 334 5.7 20.1 56 81
# 2 6 12 71 31 332 1.7 20.7 65 93
# 3 7 7 135 7 314 4.1 14.9 73 92
# 4 8 9 168 24 273 2.3 15.5 72 97
# 5 9 7 96 14 259 2.8 16.6 63 93
Schritt 1: Lassen Sie uns brechen sie in Schritten. Lassen Sie uns zuerst die Definition von 'aqm' alleine lassen und von den geschmolzenen Daten arbeiten. Dies wird das Beispiel leichter verständlich machen.
aqm <- melt(airquality, id=c("Month", "Day"), na.rm=TRUE)
# Month Day variable value
# 1 5 1 Ozone 41.0
# 2 5 2 Ozone 36.0
# 3 5 3 Ozone 12.0
# 4 5 4 Ozone 18.0
# ...
# 612 9 30 Temp 68.0
Schritt 2: Jetzt wollen wir die 'Wert' Spalte mit 'min' und 'max' Spalten ersetzen. Dies können wir mit der Funktion "ddply" aus dem Paket "plyr" erreichen. Dazu verwenden wir die Funktion 'ddply' (Datenrahmen als Eingabe, Datenrahmen als Ausgabe, daher "dd" -ply). Wir spezifizieren zuerst die Daten.
Und dann geben wir die Variablen an, die wir verwenden wollen, um unsere Daten zu gruppieren, "Monat" und "Variable". Wir verwenden die .
Funktion, um direkt auf diese Variablen zu verweisen, anstatt auf die Werte zu verweisen, die sie enthalten.
ddply(aqm, .(Month, variable),
Jetzt müssen wir eine aggregierende Funktion wählen. Wir wählen die Funktion summarize
hier, weil wir Spalten ('Tag' und 'Wert') haben, die wir nicht in unsere endgültigen Daten aufnehmen wollen. Die summarize
Funktion entfernt alle ursprünglichen, nicht gruppierenden Spalten.
ddply(aqm, .(Month, variable), summarize,
Schließlich geben wir die Berechnung für jede Gruppe an. Wir können auf die Spalten des ursprünglichen Datenrahmens ('aqm') verweisen, auch wenn sie nicht in unserem endgültigen Datenrahmen enthalten sind. Dies ist, wie es aussieht:
aqm_ply <- ddply(aqm, .(Month, variable), summarize, min=min(value), max=max(value))
# Month variable min max
# 1 5 Ozone 1.0 115.0
# 2 5 Solar.R 8.0 334.0
# 3 5 Wind 5.7 20.1
# 4 5 Temp 56.0 81.0
# 5 6 Ozone 12.0 71.0
# 6 6 Solar.R 31.0 332.0
# 7 6 Wind 1.7 20.7
# 8 6 Temp 65.0 93.0
# 9 7 Ozone 7.0 135.0
# 10 7 Solar.R 7.0 314.0
# 11 7 Wind 4.1 14.9
# 12 7 Temp 73.0 92.0
# 13 8 Ozone 9.0 168.0
# 14 8 Solar.R 24.0 273.0
# 15 8 Wind 2.3 15.5
# 16 8 Temp 72.0 97.0
# 17 9 Ozone 7.0 96.0
# 18 9 Solar.R 14.0 259.0
# 19 9 Wind 2.8 16.6
# 20 9 Temp 63.0 93.0
Schritt 3: Wir können sehen, dass die Daten erheblich reduziert, da die ddply
Funktion die Zeilen zusammengefasst hat. Jetzt müssen wir die Daten wieder aufschmelzen, damit wir unsere zweite Variable für den endgültigen Datenrahmen bekommen können. Beachten Sie, dass wir ein neues variable.name
Argument angeben müssen, also haben wir keine zwei Spalten namens "variable".
aqm_melt <- melt(aqm_ply, id=c("Month", "variable"), variable.name="variable2")
# Month variable variable2 value
# 1 5 Ozone min 1.0
# 2 5 Solar.R min 8.0
# 3 5 Wind min 5.7
# 4 5 Temp min 56.0
# 5 6 Ozone min 12.0
# ...
# 37 9 Ozone max 96.0
# 38 9 Solar.R max 259.0
# 39 9 Wind max 16.6
# 40 9 Temp max 93.0
Schritt 4: Und wir können es schließlich alles zusammen wickeln unsere Daten in die endgültige Form gegossen wird.
dcast(aqm_melt, Month ~ variable + variable2)
# Month Ozone_min Ozone_max Solar.R_min Solar.R_max Wind_min Wind_max Temp_min Temp_max
# 1 5 1 115 8 334 5.7 20.1 56 81
# 2 6 12 71 31 332 1.7 20.7 65 93
# 3 7 7 135 7 314 4.1 14.9 73 92
# 4 8 9 168 24 273 2.3 15.5 72 97
# 5 9 7 96 14 259 2.8 16.6 63 93
Hoffentlich gibt Ihnen dieses Beispiel genug Verständnis für den Einstieg. Beachten Sie, dass eine neue, datenrahmenoptimierte Version des 'plyr' Pakets aktiv unter dem Namen 'dplyr' entwickelt wird, so dass Sie vielleicht bereit sein möchten, Ihren Code in das neue Paket zu konvertieren, nachdem es vollständig flügge geworden ist.
Haben Sie auch 'Namen (Luftqualität) <- tolower (Namen (Luftqualität))' am Anfang ausgeführt? –
Nein, die Spaltennamen sind bereits in Kleinbuchstaben ... es gab keine Notwendigkeit. – mrcalvin