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 


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow