Recherche…


Syntaxe

  • Faire fondre avec melt(DT, id.vars=c(..), variable.name="CategoryLabel", value.name="Value")
  • Cast avec dcast(DT, LHS ~ RHS, value.var="Value", fun.aggregate=sum)

Paramètres

Paramètre Détails
id.vars dire melt quelles colonnes conserver
Nom de variable dire melt quoi appeler la colonne avec les étiquettes de catégorie
value.name dire à melt comment appeler la colonne qui a des valeurs associées aux étiquettes de catégorie
value.var dire à dcast où trouver les valeurs à dcast en colonnes
formule indiquer à dcast colonnes à conserver pour former un identifiant d'enregistrement unique (LHS) et lequel contient les étiquettes de catégorie (RHS)
fun.aggregate spécifier la fonction à utiliser lorsque l'opération de transtypage génère une liste de valeurs dans chaque cellule

Remarques

Une grande partie de ce qui entre dans le conditionnement des données pour construire des modèles ou des visualisations peut être accomplie avec data.table . En comparaison avec d'autres options, data.table offre des avantages de rapidité et de flexibilité.

Pivoter et défaire des données tabulaires avec data.table - I

Convertir d'une forme large à une forme longue

Charger des data USArrests partir de datasets de 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

Utilisez ?USArrests pour en savoir plus. Tout d'abord, convertir en data.table . Les noms d'états sont des noms de lignes dans le data.frame origine.

library(data.table)
DT <- as.data.table(USArrests, keep.rownames=TRUE)

Ce sont des données dans la forme large. Il a une colonne pour chaque variable. Les données peuvent également être stockées sous forme longue sans perte d'informations. Le formulaire long contient une colonne qui stocke les noms de variable. Ensuite, il a une autre colonne pour les valeurs de la variable. La forme longue de USArrests ressemble à ça.

            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

Nous utilisons la fonction de melt pour passer de la forme large à la forme longue.

DTm <- melt(DT)
names(DTm) <- c("State", "Crime", "Rate")

Par défaut, la melt traite toutes les colonnes avec des données numériques en tant que variables avec des valeurs. Aux USArrests - USArrests , la variable UrbanPop représente le pourcentage de la population urbaine d'un État. Il est différent des autres variables, Murder , Assault et Rape , qui sont des crimes violents signalés pour 100 000 personnes. Supposons que nous voulions conserver la colonne UrbanPop . Nous y id.vars définissant id.vars comme suit.

DTmu <- melt(DT, id.vars=c("rn", "UrbanPop" ), 
             variable.name='Crime', value.name = "Rate")
names(DTmu)[1] <- "State"

Notez que nous avons spécifié les noms de la colonne contenant les noms de catégories (Murder, Assault, etc.) avec variable.name et la colonne contenant les valeurs avec value.name . Nos données ressemblent tellement.

             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

Générer des résumés avec une approche de style split-apply-combine est un jeu d'enfant. Par exemple, pour résumer les crimes violents par État?

DTmu[, .(ViolentCrime = sum(Rate)), by=State]

Cela donne:

        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

Données tabulaires pivotantes et non pivotées avec data.table - II

Convertir de forme longue en forme large

Pour récupérer des données de l'exemple précédent, utilisez dcast comme ça.

DTc <- dcast(DTmu, State + UrbanPop ~ Crime)

Cela donne les données dans la forme large d'origine.

             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

Ici, la notation de formule est utilisée pour spécifier les colonnes qui forment un identificateur d'enregistrement unique (LHS) et la colonne contenant les étiquettes de catégorie pour les nouveaux noms de colonne (RHS). Quelle colonne utiliser pour les valeurs numériques? Par défaut, dcast utilise la première colonne avec des valeurs numériques restantes lors de la spécification de la formule. Pour rendre explicite, utilisez le paramètre value.var avec le nom de la colonne.

Lorsque l'opération produit une liste de valeurs dans chaque cellule, dcast fournit une méthode fun.aggregate pour gérer la situation. Disons que je m'intéresse aux États ayant une population urbaine similaire lors de l'enquête sur les taux de criminalité. J'ajoute une colonne Decile avec les informations calculées.

DTmu[, Decile := cut(UrbanPop, quantile(UrbanPop, probs = seq(0, 1, by=0.1)))]
levels(DTmu$Decile) <- paste0(1:10, "D")

Maintenant, en jetant Decile ~ Crime produit plusieurs valeurs par cellule. Je peux utiliser fun.aggregate pour déterminer comment ils sont gérés. Le texte et les valeurs numériques peuvent être manipulés de cette manière.

dcast(DTmu, Decile ~ Crime, value.var="Rate", fun.aggregate=sum)

Cela donne:

dcast(DTmu, Decile ~ Crime, value.var="Rate", fun.aggregate=mean)

Cela donne:

             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

Il y a plusieurs états dans chaque décile de la population urbaine. Utilisez fun.aggregate pour spécifier comment ces éléments doivent être gérés.

dcast(DTmu, Decile ~ Crime, value.var="Rate", fun.aggregate=sum)

Cela résume les données pour les états similaires, donnant les éléments suivants.

    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
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow