R Language
Draaien en ontkoppelen met data.table
Zoeken…
Syntaxis
- Smelten met
melt(DT, id.vars=c(..), variable.name="CategoryLabel", value.name="Value")
- Casten met
dcast(DT, LHS ~ RHS, value.var="Value", fun.aggregate=sum)
parameters
Parameter | Details |
---|---|
id.vars | vertel melt welke kolommen behouden moeten worden |
variable.name | vertel melt wat de kolom met categorielabels moet worden genoemd |
value.name | vertel melt wat de kolom moet worden genoemd met waarden die zijn gekoppeld aan categorielabels |
value.var | vertel dcast waar de te vinden waarden in kolommen kunnen worden gevonden |
formule | vertel dcast welke kolommen moeten worden dcast om een unieke record-ID (LHS) te vormen en welke de categorielabels (RHS) bevat |
fun.aggregate | specificeer de functie die moet worden gebruikt wanneer de castingbewerking een zoeklijst in elke cel genereert |
Opmerkingen
Veel van wat gaat over het conditioneren van gegevens om modellen of visualisaties te bouwen, kan worden bereikt met data.table
. In vergelijking met andere opties biedt data.table
voordelen als snelheid en flexibiliteit.
Gegevens in tabelvorm draaien en ontkoppelen met data.table - I
Converteer van brede vorm naar lange vorm
data USArrests
laden data USArrests
van 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
Gebruik ?USArrests
om meer te weten te komen. Converteer eerst naar data.table
. De namen van staten zijn data.frame
in het oorspronkelijke data.frame
.
library(data.table)
DT <- as.data.table(USArrests, keep.rownames=TRUE)
Dit zijn gegevens in de brede vorm. Het heeft een kolom voor elke variabele. De gegevens kunnen ook in lange vorm worden opgeslagen zonder verlies van informatie. De lange vorm heeft één kolom waarin de variabelenamen worden opgeslagen. Vervolgens heeft het een andere kolom voor de variabele waarden. De lange vorm van USArrests
ziet er zo uit.
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
We gebruiken de melt
om van brede vorm naar lange vorm te schakelen.
DTm <- melt(DT)
names(DTm) <- c("State", "Crime", "Rate")
Standaard behandelt melt
alle kolommen met numerieke gegevens als variabelen met waarden. In USArrests
vertegenwoordigt de variabele UrbanPop
het percentage stedelijke bevolking van een staat. Het verschilt van de andere variabelen, Murder
, Assault
en Rape
, die gewelddadige misdaden zijn gerapporteerd per 100.000 mensen. Stel dat we de UrbanPop
kolom willen behouden. We bereiken dit door id.vars
als volgt in te stellen.
DTmu <- melt(DT, id.vars=c("rn", "UrbanPop" ),
variable.name='Crime', value.name = "Rate")
names(DTmu)[1] <- "State"
Merk op dat we de namen hebben opgegeven van de kolom met categorienamen (Murder, Assault, etc.) met variable.name
en de kolom met de waarden met value.name
. Onze gegevens zien er zo uit.
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
Het genereren van samenvattingen met een split-apply-combineer stijlbenadering is een eitje. Bijvoorbeeld om geweldsmisdrijven per staat samen te vatten?
DTmu[, .(ViolentCrime = sum(Rate)), by=State]
Dit geeft:
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
Gegevens in tabelvorm draaien en ontkoppelen met data.table - II
Converteer van lange vorm naar brede vorm
Gebruik dcast
als volgt om gegevens uit het vorige voorbeeld te herstellen.
DTc <- dcast(DTmu, State + UrbanPop ~ Crime)
Dit geeft de gegevens in de oorspronkelijke brede vorm.
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 wordt de formule-notatie gebruikt om de kolommen op te geven die een unieke record-ID (LHS) vormen en de kolom met categorielabels voor nieuwe kolomnamen (RHS). Welke kolom moet u gebruiken voor de numerieke waarden? Standaard gebruikt dcast
de eerste kolom met de resterende numerieke waarden uit de formulespecificatie. Gebruik de parameter value.var
met kolomnaam om expliciet te maken.
Wanneer de bewerking een zoeklijst in elke cel dcast
biedt fun.aggregate
een fun.aggregate
methode om de situatie aan te pakken. Stel dat ik geïnteresseerd ben in staten met een vergelijkbare stedelijke bevolking bij het onderzoeken van criminaliteitscijfers. Ik voeg een kolom Decile
met berekende informatie.
DTmu[, Decile := cut(UrbanPop, quantile(UrbanPop, probs = seq(0, 1, by=0.1)))]
levels(DTmu$Decile) <- paste0(1:10, "D")
Nu werpt Decile ~ Crime
meerdere waarden per cel. Ik kan fun.aggregate
gebruiken fun.aggregate
te bepalen hoe hiermee wordt omgegaan. Zowel tekst als numerieke waarden kunnen op deze manier worden verwerkt.
dcast(DTmu, Decile ~ Crime, value.var="Rate", fun.aggregate=sum)
Dit geeft:
dcast(DTmu, Decile ~ Crime, value.var="Rate", fun.aggregate=mean)
Dit geeft:
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
Er zijn meerdere staten in elk deciel van de stedelijke bevolking. Gebruik fun.aggregate
om op te geven hoe hiermee moet worden omgegaan.
dcast(DTmu, Decile ~ Crime, value.var="Rate", fun.aggregate=sum)
Deze somt de gegevens voor soortgelijke toestanden op, en geeft het volgende.
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