R Language
Pivot und Unpivot mit data.table
Suche…
Syntax
- Schmelze
melt(DT, id.vars=c(..), variable.name="CategoryLabel", value.name="Value")
- Cast mit
dcast(DT, LHS ~ RHS, value.var="Value", fun.aggregate=sum)
Parameter
Parameter | Einzelheiten |
---|---|
id.vars | Sagen Sie der melt welche Säulen sie behalten sollen |
Variablennamen | tell melt , was die Spalte mit der Kategorie Etiketten aufrufen |
value.name | Sagen Sie der melt wie die Spalte aufgerufen werden soll, deren Werte mit Kategoriebeschriftungen verknüpft sind |
value.var | dcast sagen, wo die Werte zu finden sind, die in Spalten umgewandelt werden sollen |
Formel | dcast mitteilen, welche Spalten beibehalten werden sollen, um eine eindeutige Datensatzkennung (LHS) zu bilden, und welche dcast die Kategorienbezeichnungen (RHS) enthält |
fun.aggregate | Geben Sie die zu verwendende Funktion an, wenn der Castingvorgang in jeder Zelle eine Liste von Werten generiert |
Bemerkungen
Ein Großteil dessen, was zur Konditionierung von Daten zum Erstellen von Modellen oder Visualisierungen benötigt wird, kann mit data.table
. Im Vergleich zu anderen Optionen bietet data.table
Vorteile in data.table
auf Geschwindigkeit und Flexibilität.
Tabellendaten mit data.table - I
Konvertieren Sie von Breitform in Langform
Laden Sie data USArrests
aus datasets
.
data("USArrests")
head(USArrests)
Murder Assault UrbanPop Rape
Alabama 13.2 236 58 21.2
Alaska 10.0 263 48 44.5
Arizona 8.1 294 80 31.0
Arkansas 8.8 190 50 19.5
California 9.0 276 91 40.6
Colorado 7.9 204 78 38.7
Verwenden Sie ?USArrests
, um mehr zu erfahren. Konvertieren Sie zuerst in data.table
. Die Zustandsnamen sind data.frame
im ursprünglichen data.frame
.
library(data.table)
DT <- as.data.table(USArrests, keep.rownames=TRUE)
Dies sind Daten in der breiten Form. Für jede Variable gibt es eine Spalte. Die Daten können auch ohne Informationsverlust in langer Form gespeichert werden. Das lange Formular enthält eine Spalte, in der die Variablennamen gespeichert sind. Dann hat es eine weitere Spalte für die Variablenwerte. Die lange Form von USA- USArrests
sieht so aus.
State Crime Rate
1: Alabama Murder 13.2
2: Alaska Murder 10.0
3: Arizona Murder 8.1
4: Arkansas Murder 8.8
5: California Murder 9.0
---
196: Virginia Rape 20.7
197: Washington Rape 26.2
198: West Virginia Rape 9.3
199: Wisconsin Rape 10.8
200: Wyoming Rape 15.6
Wir verwenden die melt
, um von Breitform zu Langform zu wechseln.
DTm <- melt(DT)
names(DTm) <- c("State", "Crime", "Rate")
Standardmäßig behandelt melt
alle Spalten mit numerischen Daten als Variablen mit Werten. In USArrests
UrbanPop
repräsentiert die Variable UrbanPop
den prozentualen Anteil der städtischen Bevölkerung eines Staates. Es unterscheidet sich von den anderen variabes, Murder
, Assault
und Rape
, die pro 100.000 Menschen berichteten Gewaltverbrechen sind. Angenommen, wir möchten die UrbanPop
Spalte beibehalten. Dies erreichen wir, indem wir id.vars
wie folgt id.vars
.
DTmu <- melt(DT, id.vars=c("rn", "UrbanPop" ),
variable.name='Crime', value.name = "Rate")
names(DTmu)[1] <- "State"
Beachten Sie, dass wir die Namen der Spalte angegeben haben, die Kategorienamen (Murder, Assault usw.) mit variable.name
und die Spalte, die die Werte mit value.name
. Unsere Daten sehen so aus.
State UrbanPop Crime Rate
1: Alabama 58 Murder 13.2
2: Alaska 48 Murder 10.0
3: Arizona 80 Murder 8.1
4: Arkansas 50 Murder 8.8
5: California 91 Murder 9.0
Das Erstellen von Zusammenfassungen mit Split-Apply-Combine-Stil ist ein Kinderspiel. Zum Beispiel, um Gewaltverbrechen nach Staat zusammenzufassen?
DTmu[, .(ViolentCrime = sum(Rate)), by=State]
Das gibt:
State ViolentCrime
1: Alabama 270.4
2: Alaska 317.5
3: Arizona 333.1
4: Arkansas 218.3
5: California 325.6
6: Colorado 250.6
Tabellendaten mit data.table - II pivotieren und aufheben
Konvertieren Sie von Langform in Breitform
Um Daten aus dem vorherigen Beispiel dcast
, verwenden Sie dcast
so.
DTc <- dcast(DTmu, State + UrbanPop ~ Crime)
Dies gibt die Daten in der ursprünglichen breiten Form an.
State UrbanPop Murder Assault Rape
1: Alabama 58 13.2 236 21.2
2: Alaska 48 10.0 263 44.5
3: Arizona 80 8.1 294 31.0
4: Arkansas 50 8.8 190 19.5
5: California 91 9.0 276 40.6
Hier wird die Formelnotation verwendet, um die Spalten anzugeben, die eine eindeutige Datensatzkennung (LHS) bilden, und die Spalte, die Kategoriebeschriftungen für neue Spaltennamen (RHS) enthält. Welche Spalte für die numerischen Werte? Standardmäßig verwendet dcast
die erste Spalte mit numerischen Werten, die bei der Angabe der Formel übrig bleiben. Um dies explizit zu machen, verwenden Sie den Parameter value.var
mit dem Spaltennamen.
Wenn der Vorgang eine Liste von Werten in jeder Zelle erzeugt, dcast
stellt eine fun.aggregate
Methode , die Situation zu handhaben . Angenommen, ich interessiere mich für Staaten mit einer ähnlichen städtischen Bevölkerung, wenn die Kriminalitätsrate untersucht wird. Ich füge eine Spalte Decile
mit berechneten Informationen hinzu.
DTmu[, Decile := cut(UrbanPop, quantile(UrbanPop, probs = seq(0, 1, by=0.1)))]
levels(DTmu$Decile) <- paste0(1:10, "D")
Wenn Sie Decile ~ Crime
werden jetzt mehrere Werte pro Zelle erzeugt. Ich kann fun.aggregate
um festzustellen, wie mit diesen fun.aggregate
wird. Sowohl Text- als auch Zahlenwerte können auf diese Weise verarbeitet werden.
dcast(DTmu, Decile ~ Crime, value.var="Rate", fun.aggregate=sum)
Das gibt:
dcast(DTmu, Decile ~ Crime, value.var="Rate", fun.aggregate=mean)
Das gibt:
State UrbanPop Crime Rate Decile
1: Alabama 58 Murder 13.2 4D
2: Alaska 48 Murder 10.0 2D
3: Arizona 80 Murder 8.1 8D
4: Arkansas 50 Murder 8.8 2D
5: California 91 Murder 9.0 10D
In jedem Dezil der städtischen Bevölkerung gibt es mehrere Staaten. Verwenden Sie fun.aggregate
um anzugeben, wie diese behandelt werden sollen.
dcast(DTmu, Decile ~ Crime, value.var="Rate", fun.aggregate=sum)
Dies summiert sich über die Daten für ähnliche Zustände, was folgendes ergibt.
Decile Murder Assault Rape
1: 1D 39.4 808 62.6
2: 2D 35.3 815 94.3
3: 3D 22.6 451 67.7
4: 4D 54.9 898 106.0
5: 5D 42.4 758 107.6