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) con dcast(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 


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow