R Language
Pivot e unpivot con data.table
Ricerca…
Sintassi
- Melt with
melt(DT, id.vars=c(..), variable.name="CategoryLabel", value.name="Value")
-
dcast(DT, LHS ~ RHS, value.var="Value", fun.aggregate=sum)
condcast(DT, LHS ~ RHS, value.var="Value", fun.aggregate=sum)
Parametri
Parametro | Dettagli |
---|---|
id.vars | dire melt quali colonne conservare |
variable.name | dire melt cosa chiamare la colonna con le etichette di categoria |
value.name | dire melt cosa chiamare la colonna che ha valori associati alle etichette di categoria |
value.var | dì a dcast dove trovare i valori da dcast nelle colonne |
formula | dire dcast le colonne da mantenere per formare un identificatore univoco del record (LHS) e quale detiene le etichette di categoria (RHS) |
fun.aggregate | specificare la funzione da utilizzare quando l'operazione di fusione genera un elenco di valori in ogni cella |
Osservazioni
Molto di ciò che va a condizionare i dati per costruire modelli o visualizzazioni può essere realizzato con data.table
. In confronto ad altre opzioni, data.table
offre vantaggi di velocità e flessibilità.
Ruota e apri i dati tabulari con data.table - I
Converti da forma estesa a forma lunga
Carica i data USArrests
dai datasets
di 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
Usa ?USArrests
per saperne di più. Innanzitutto, converti in data.table
. I nomi degli stati sono nomi di righe nel data.frame
originale.
library(data.table)
DT <- as.data.table(USArrests, keep.rownames=TRUE)
Si tratta di dati in forma estesa. Ha una colonna per ogni variabile. I dati possono anche essere memorizzati in forma estesa senza perdita di informazioni. Il modulo lungo ha una colonna che memorizza i nomi delle variabili. Quindi, ha un'altra colonna per i valori delle variabili. La lunga forma di USArrests
sembra così.
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
Usiamo la funzione di melt
per passare dalla forma estesa alla forma lunga.
DTm <- melt(DT)
names(DTm) <- c("State", "Crime", "Rate")
Per impostazione predefinita, melt
considera tutte le colonne con dati numerici come variabili con valori. Negli USArrests
, la variabile UrbanPop
rappresenta la percentuale di popolazione urbana di uno stato. È diverso dalle altre variabili, Murder
, Assault
e Rape
, che sono crimini violenti riportati per 100.000 persone. Supponiamo di voler conservare la colonna UrbanPop
. Otteniamo questo impostando id.vars
come segue.
DTmu <- melt(DT, id.vars=c("rn", "UrbanPop" ),
variable.name='Crime', value.name = "Rate")
names(DTmu)[1] <- "State"
Si noti che abbiamo specificato i nomi della colonna contenente i nomi delle categorie (Omicidi, Assalto, ecc.) Con variable.name
e la colonna contenente i valori con value.name
. I nostri dati sembrano così.
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
Generare riepiloghi con un approccio di tipo split-apply-combine è un gioco da ragazzi. Ad esempio, per riassumere i crimini violenti da parte dello stato?
DTmu[, .(ViolentCrime = sum(Rate)), by=State]
Questo da:
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
Ruota e apri i dati tabulari con data.table - II
Converti da forma lunga a forma estesa
Per recuperare i dati dall'esempio precedente, usa dcast
come tale.
DTc <- dcast(DTmu, State + UrbanPop ~ Crime)
Questo dà i dati nella forma ampia originale.
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
Qui, la notazione della formula viene utilizzata per specificare le colonne che formano un identificatore di record univoco (LHS) e la colonna contenente le etichette di categoria per i nuovi nomi di colonna (RHS). Quale colonna utilizzare per i valori numerici? Per impostazione predefinita, dcast
utilizza la prima colonna con valori numerici rimasti quando la specifica della formula. Per rendere esplicito, utilizzare il parametro value.var
con il nome della colonna.
Quando l'operazione produce un elenco di valori in ogni cella, dcast
fornisce un metodo fun.aggregate
per gestire la situazione. Dite che mi interessano gli stati con popolazione urbana simile quando studiano i tassi di criminalità. Aggiungo una colonna Decile
con informazioni calcolate.
DTmu[, Decile := cut(UrbanPop, quantile(UrbanPop, probs = seq(0, 1, by=0.1)))]
levels(DTmu$Decile) <- paste0(1:10, "D")
Ora, lanciare Decile ~ Crime
produce più valori per cella. Posso usare fun.aggregate
per determinare come vengono gestiti. Sia il testo che i valori numerici possono essere gestiti in questo modo.
dcast(DTmu, Decile ~ Crime, value.var="Rate", fun.aggregate=sum)
Questo da:
dcast(DTmu, Decile ~ Crime, value.var="Rate", fun.aggregate=mean)
Questo da:
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
Ci sono più stati in ogni decile della popolazione urbana. Usa fun.aggregate
per specificare come devono essere gestiti questi elementi.
dcast(DTmu, Decile ~ Crime, value.var="Rate", fun.aggregate=sum)
Questo somma i dati per stati simili, dando il seguente.
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