R Language
Pivot et unpivot avec data.table
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