Cours
Il arrive souvent de devoir convertir des données du format long (appelé ici « long-form », dont le sens deviendra clair plus loin) au format large, et inversement. Dans la vraie vie, les données arrivent sous toutes sortes de formats, mais la plupart des fonctions R sont conçues pour un format précis.
Par exemple, lme4::lmer() pour les modèles linéaires mixtes, ou ggplot2::ggplot() pour la visualisation, sont conçues pour le format long. À l’inverse, d’autres fonctions, comme mosaicplot(), attendent un format large. Concrètement, vous devrez convertir le format pour analyser ou visualiser, sauf si les données sont déjà préparées dans le bon format.
R propose plusieurs options pour convertir les formats, ce qui peut être déroutant quand on débute.
Ce tutoriel vous aide à comprendre la mécanique de conversion entre format long et format large. Vous allez aborder les points suivants :
- Découvrir en détail le format long.
- Comprendre ensuite le format large.
- Revoir les différences entre les deux formats.
- Identifier les étapes à suivre pour passer de l’un à l’autre.
- Enfin, mettre tout cela en pratique avec R : passer du long au large et inversement grâce aux fonctions
melt()etdcast().
Les données
| name | gender | year2011 | year2012 | year2013 | year2014 | year2015 |
|---|---|---|---|---|---|---|
| Jackson Smith | M | 74.69 | 84.99 | 91.73 | 105.11 | 111.04 |
| Sophia Johnson | F | NA | NA | NA | NA | 75.89 |
| Emma Williams | F | NA | NA | 75.74 | 86.50 | 91.50 |
| Aiden Jones | M | NA | NA | NA | 71.89 | 81.42 |
| Liam Brown | M | 88.24 | 96.91 | 101.85 | 108.13 | 112.45 |
| Lucas Davis | M | 70.60 | 83.78 | 94.17 | 100.03 | 106.35 |
| Olivia Miller | F | 64.78 | 80.76 | 87.30 | 97.13 | 103.80 |
| Ava Wilson | F | 88.77 | 96.45 | 104.72 | 112.84 | NA |
Ce tableau indique la taille de bébés dans une petite zone géographique, mesurée de 2011 à 2015. Comme vous le savez sans doute, NA signifie « non disponible ». À partir de la position des NA, on peut déduire l’âge des bébés, mais l’âge exact n’apparaît pas dans le tableau. Il semble bien organisé, mais pour étudier la croissance, l’information clé n’est pas la date de mesure absolue, c’est l’âge de l’enfant au moment de la mesure. Pourriez-vous ajouter cette information ? Voici une possibilité :
| name | gender | age0 | age1 | age2 | age3 | age4 | age5 | age6 |
|---|---|---|---|---|---|---|---|---|
| Jackson Smith | M | NA | 76.69 | 84.91 | 97.06 | 105.73 | 107.32 | NA |
| Sophia Johnson | F | NA | 76.05 | NA | NA | NA | NA | NA |
| Emma Williams | F | 72.65 | 82.46 | 91.76 | NA | NA | NA | NA |
| Aiden Jones | M | 69.76 | 79.89 | NA | NA | NA | NA | NA |
| Liam Brown | M | NA | NA | 85.34 | 93.22 | 105.78 | 105.84 | 114.82 |
| Lucas Davis | M | 71.59 | 84.87 | 92.10 | 100.73 | 104.21 | NA | NA |
| Olivia Miller | F | 62.74 | 81.39 | 92.02 | 98.32 | 106.44 | NA | NA |
| Ava Wilson | F | NA | NA | 88.39 | 100.67 | 107.58 | 111.52 | NA |
Le nombre de NA a augmenté. ## Données au format large Mais que faire si vous voulez indiquer l’âge en mois ? Cela donnerait quelque chose comme ceci :
| name | gender | m4 | m6 | m7 | m10 | m12 | ... | m55 | m60 | m65 | m72 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| Jackson Smith | M | NA | NA | NA | NA | 76.69 | ... | NA | 107.32 | NA | NA |
| Sophia Johnson | F | NA | NA | NA | NA | 76.05 | ... | NA | NA | NA | NA |
| Emma Williams | F | NA | NA | NA | 72.65 | NA | ... | NA | NA | NA | NA |
| Aiden Jones | M | NA | 69.76 | NA | NA | NA | ... | NA | NA | NA | NA |
| Liam Brown | M | NA | NA | NA | NA | NA | ... | NA | 105.84 | NA | 114.82 |
| Lucas Davis | M | NA | NA | 71.59 | NA | NA | ... | 104.21 | NA | NA | NA |
| Olivia Miller | F | 62.74 | NA | NA | NA | NA | ... | NA | NA | NA | NA |
| Ava Wilson | F | NA | NA | NA | NA | NA | ... | NA | NA | 111.52 | NA |
On trouve une multitude de NA dans ce tableau. Si les moments de mesure relatifs diffèrent d’un bébé à l’autre, le format large gaspille de la place. Une autre option est d’indiquer les âges des bébés pour l’année 2015, mais cela n’est possible que si les temps de mesure absolus sont identiques. Si les mesures sont décalées de quelques mois et que vous souhaitez l’âge en mois, cela ne fonctionne pas. Dans ce cas, l’exemple ci-dessus reste la seule voie. Vous pouvez alors envisager le format long. ## Données au format long Alors que, dans le format large, toutes les mesures d’un bébé figurent sur une seule ligne, en format long, chaque ligne ne contient qu’une seule mesure d’un bébé. La façon la plus simple : afficher le nom, le moment de mesure et la mesure (la taille) sur une seule ligne. C’est précisément ce que montre ce tableau :
| name | gender | month | height |
|---|---|---|---|
| Olivia Miller | F | 4 | 62.74 |
| Aiden Jones | M | 6 | 69.76 |
| Lucas Davis | M | 7 | 71.59 |
| Emma Williams | F | 10 | 72.65 |
| Jackson Smith | M | 12 | 76.69 |
| ... | ... | ... | ... |
| Liam Brown | M | 72 | 114.82 |
En ordonnant les données par nom, vous obtenez quelque chose comme le tableau ci-dessous. Évidemment, il occupe beaucoup moins d’espace que le tableau 3 plus haut !
| name | gender | month | height |
|---|---|---|---|
| Jackson Smith | M | 12 | 76.69 |
| Jackson Smith | M | 24 | 84.91 |
| Jackson Smith | M | 36 | 97.06 |
| Jackson Smith | M | 48 | 105.73 |
| Jackson Smith | M | 60 | 107.32 |
| Sophia Johnson | F | 12 | 76.05 |
| Emma Williams | F | 10 | 72.65 |
| ... | ... | ... | ... |
| Ava Wilson | F | 65 | 111.52 |
Format long vs format large
Rappel des différences fondamentales entre format large et format long : un point simple est que le format large regroupe de nombreuses mesures d’un individu sur une ligne, et les noms de colonnes décrivent ces mesures.
Ce tableau présente, sur une ligne, les tailles de Liam Brown de 2011 à 2015 :
| name | gender | year2011 | year2012 | year2013 | year2014 | year2015 |
|---|---|---|---|---|---|---|
| Liam Brown | M | 88.24 | 96.91 | 101.85 | 108.13 | 112.45 |
En format long, les tailles de Liam Brown sont affichées dans une seule colonne :
| name | gender | _ |
|---|---|---|
| Liam Brown | M | 85.34 |
| Liam Brown | M | 93.22 |
| Liam Brown | M | 105.78 |
| Liam Brown | M | 105.84 |
| Liam Brown | M | 114.82 |
Comme vous le voyez, on ne sait pas à quoi correspondent ces mesures. Si l’on ajoute le nom de colonne, on obtient ceci :
| name | gender | year2011, 2012, 2013, 2014, 2015 |
|---|---|---|
| Liam Brown | M | 85.34 |
| Liam Brown | M | 93.22 |
| Liam Brown | M | 105.78 |
| Liam Brown | M | 105.84 |
| Liam Brown | M | 114.82 |
Mais cela pose un autre problème. La taille de Sophia Johnson n’a pas été mesurée entre 2011 et 2014. Comme vous pouvez le voir ci-dessous, il devient difficile de nommer correctement la colonne :
| name | gender | ? |
|---|---|---|
| Liam Brown | M | 85.34 |
| Liam Brown | M | 93.22 |
| Liam Brown | M | 105.78 |
| Liam Brown | M | 105.84 |
| Liam Brown | M | 114.82 |
| Sophia Johnson | F | 76.05 |
Du format large au format long
Passer du format large au format long peut se concevoir étape par étape. Avant de rassembler les mesures de plusieurs colonnes en une seule, vous pouvez transformer le tableau pour qu’il ne contienne qu’une mesure par ligne. Faisons-le pour ce tableau :
| name | gender | age0 | age1 | age2 | age3 | age4 | age5 | age6 |
|---|---|---|---|---|---|---|---|---|
| Emma Williams | F | 72.65 | 82.46 | 91.76 | NA | NA | NA | NA |
| Aiden Jones | M | 69.76 | 79.89 | NA | NA | NA | NA | NA |
Le résultat ressemble au tableau ci-dessous :
| name | gender | age0 | age1 | age2 | age3 | age4 | age5 | age6 |
|---|---|---|---|---|---|---|---|---|
| Emma Williams | F | 72.65 | NA | NA | NA | NA | ||
| Emma Williams | F | 82.46 | NA | |||||
| Emma Williams | F | 91.76 | ||||||
| Aiden Jones | M | 69.76 | NA | NA | NA | NA | NA | |
| Aiden Jones | M | 79.89 |
Avant de rassembler ces mesures éparses dans une seule colonne, ajoutez une colonne qui précise de quoi il s’agit, comme ci-dessous :
| name | gender | measure | age0 | age1 | age2 | age3 | age4 | age5 | age6 |
|---|---|---|---|---|---|---|---|---|---|
| Emma Williams | F | age0 | 72.65 | NA | NA | NA | NA | ||
| Emma Williams | F | age1 | 82.46 | NA | |||||
| Emma Williams | F | age2 | 91.76 | ||||||
| Aiden Jones | M | age0 | 69.76 | NA | NA | NA | NA | NA | |
| Aiden Jones | M | age1 | 79.89 |
Le nom de cette colonne est souvent "measure" ou "key". Vous remarquez que "age0", "age1", "age2", "age3", "age4", "age5" apparaissent à la fois en noms de colonnes et dans une colonne. En omettant les noms de colonnes, on obtient :
| name | gender | measure | _ | __ | ___ | ____ | _____ | ______ | _______ |
|---|---|---|---|---|---|---|---|---|---|
| Emma Williams | F | age0 | 72.65 | NA | NA | NA | NA | ||
| Emma Williams | F | age1 | 82.46 | ||||||
| Emma Williams | F | age2 | 91.76 | ||||||
| Aiden Jones | M | age0 | 69.76 | NA | NA | NA | NA | NA | |
| Aiden Jones | M | age1 | 79.89 |
Comme il n’y a qu’une mesure par ligne, vous pouvez les regrouper dans une seule colonne et obtenir :
| name | gender | measure | |
|---|---|---|---|
| Emma Williams | F | age0 | 72.65 |
| Emma Williams | F | age1 | 82.46 |
| Emma Williams | F | age2 | 91.76 |
| Aiden Jones | M | age0 | 69.76 |
| Aiden Jones | M | age1 | 79.89 |
Donnez maintenant un nom de colonne à l’ensemble des mesures, généralement "value" :
| name | gender | measure | value |
|---|---|---|---|
| Emma Williams | F | age0 | 72.65 |
| Emma Williams | F | age1 | 82.46 |
| Emma Williams | F | age2 | 91.76 |
| Aiden Jones | M | age0 | 69.76 |
| Aiden Jones | M | age1 | 79.89 |
Observez le tableau ci-dessus : "age" se répète. On peut supprimer cette partie répétitive pour obtenir :
| name | gender | age | value |
|---|---|---|---|
| Emma Williams | F | 0 | 72.65 |
| Emma Williams | F | 1 | 82.46 |
| Emma Williams | F | 2 | 91.76 |
| Aiden Jones | M | 0 | 69.76 |
| Aiden Jones | M | 1 | 79.89 |
Age, qui se répétait sur chaque ligne, devient un nom de colonne. Le nom value peut être plus explicite : remplacez-le par height, qui renseigne mieux. Résultat :
| name | gender | age | height |
|---|---|---|---|
| Emma Williams | F | 0 | 72.65 |
| Emma Williams | F | 1 | 82.46 |
| Emma Williams | F | 2 | 91.76 |
| Aiden Jones | M | 0 | 69.76 |
| Aiden Jones | M | 1 | 79.89 |
Comparons les tableaux 15 et 17. value dans le tableau 15 pourrait désigner n’importe quoi, tandis que height dans le tableau 17 est précis : il s’agit uniquement de la taille. Une autre présentation possible :
| name | gender | measure | value |
|---|---|---|---|
| Emma Williams | F | height.age0 | 72.65 |
| Emma Williams | F | height.age1 | 82.46 |
| Emma Williams | F | height.age2 | 91.76 |
| Aiden Jones | M | height.age0 | 69.76 |
| Aiden Jones | M | height.age1 | 79.89 |
Considérons des mesures diverses. Si vous avez taille, poids et IMC, vous obtiendrez le tableau ci-dessous. Ici, value mélange des grandeurs de natures et d’unités différentes, ce qui peut prêter à confusion. Dans ce tableau, la taille est en centimètres et le poids en kilogrammes :
| name | gender | measure | value |
|---|---|---|---|
| Emma Williams | F | height | 72.65 |
| Emma Williams | F | weight | 8.22 |
| Emma Williams | F | BMI | 22.60 |
| Aiden Jones | M | height | 69.76 |
| Aiden Jones | M | weight | 8.51 |
En passant du large au long, vous devez donc décider quelles valeurs seront rassemblées dans une même colonne, puis choisir le nom de cette colonne.
Récapitulons : pour convertir du large au long, identifiez les colonnes à combiner dans une seule. En procédant ainsi, plusieurs colonnes fusionnent en une colonne unique ; il faut donc lui donner un nom, comme illustré ci-dessous :
| id1 | id2 | age0 | age1 | age2 |
|---|---|---|---|---|
| Emma Williams | F | NA | 82.46 | 91.76 |
| Aiden Jones | M | 69.76 | 79.89 | NA |
| Emma Williams | F | NA | 82.46 | 91.76 |
| id1 | id2 | age0 | age1 | age2 |
|---|---|---|---|---|
| Emma Williams | F | NA | ||
| Emma Williams | F | 82.46 | ||
| Emma Williams | F | 91.76 | ||
| Aiden Jones | M | 69.76 | ||
| Aiden Jones | M | 79.89 | ||
| Aiden Jones | M | NA | ||
| Emma Williams | F | NA | ||
| Emma Williams | F | 82.46 | ||
| Emma Williams | F | 91.76 |
| id1 | id2 | age_ | age0 | age1 | age2 |
|---|---|---|---|---|---|
| Emma Williams | F | age0 | NA | ||
| Emma Williams | F | age1 | 82.46 | ||
| Emma Williams | F | age2 | 91.76 | ||
| Aiden Jones | M | age0 | 69.76 | ||
| Aiden Jones | M | age1 | 79.89 | ||
| Aiden Jones | M | age2 | NA | ||
| Emma Williams | F | age0 | NA | ||
| Emma Williams | F | age1 | 82.46 | ||
| Emma Williams | F | age2 | 91.76 |
| id1 | id2 | age_ | |
|---|---|---|---|
| Emma Williams | F | age0 | NA |
| Emma Williams | F | age1 | 82.46 |
| Emma Williams | F | age2 | 91.76 |
| Aiden Jones | M | age0 | 69.76 |
| Aiden Jones | M | age1 | 79.89 |
| Aiden Jones | M | age2 | NA |
| Emma Williams | F | age0 | NA |
| Emma Williams | F | age1 | 82.46 |
| Emma Williams | F | age2 | 91.76 |
| id1 | id2 | key | value |
|---|---|---|---|
| Emma Williams | F | age0 | NA |
| Emma Williams | F | age1 | 82.46 |
| Emma Williams | F | age2 | 91.76 |
| Aiden Jones | M | age0 | 69.76 |
| Aiden Jones | M | age1 | 79.89 |
| Aiden Jones | M | age2 | NA |
| Emma Williams | F | age0 | NA |
| Emma Williams | F | age1 | 82.46 |
| Emma Williams | F | age2 | 91.76 |
| id1 | id2 | key | value |
|---|---|---|---|
| Emma Williams | F | age1 | 82.46 |
| Emma Williams | F | age2 | 91.76 |
| Aiden Jones | M | age0 | 69.76 |
| Aiden Jones | M | age1 | 79.89 |
| Emma Williams | F | age1 | 82.46 |
| Emma Williams | F | age2 | 91.76 |
Regardons les colonnes id1 et id2 ci-dessus. id2 ne désigne pas un individu ; c’est un attribut (le genre) d’un individu, c’est-à-dire une mesure. Vous pouvez donc le convertir vers un format encore plus long. Le format « le plus long » tient en trois colonnes : id, key et value.
| id | key | value |
|---|---|---|
| Emma Williams | gender | F |
| Emma Williams | age1 | 82.46 |
| Emma Williams | age2 | 91.76 |
| Aiden Jones | gender | F |
| Aiden Jones | age0 | 69.76 |
| Aiden Jones | age1 | 79.89 |
| Emma Williams | gender | F |
| Emma Williams | age1 | 82.46 |
| Emma Williams | age2 | 91.76 |
Ce tableau illustre le format « le plus long » à partir du tableau 25. Mais différentes personnes peuvent partager le même nom.
Dans ce cas, le format long peut prêter à confusion, car id ne permet pas d’identifier de manière univoque. Vous pourriez ajouter un suffixe numérique (par exemple via make.unique()), mais vous ne distinguez pas alors un nom déjà numéroté d’un nom réellement orthographié avec un point et un chiffre. Imaginez quelqu’un qui s’appelle réellement « John.2 » !
La solution évidente consiste à attribuer un identifiant numérique distinct à chaque personne. Les noms deviennent alors eux aussi des mesures.
Le tableau suivant montre que même les noms sont traités comme des mesures. En un sens, c’est le véritable « plus long » format.
| id | key | value |
|---|---|---|
| 1 | name | Emma Williams |
| 1 | gender | F |
| 1 | age1 | 82.46 |
| 1 | age2 | 91.76 |
| 2 | name | Aiden Jones |
| 2 | gender | F |
| 2 | age0 | 69.76 |
| 2 | age1 | 79.89 |
| 3 | name | Emma Williams |
| 3 | gender | F |
| 3 | age1 | 82.46 |
| 3 | age2 | 91.76 |
Ce format « le plus long » est le plus simple pour revenir au format large. En inversant le processus montré des tableaux 20 à 25, vous revenez au large. Les tableaux suivants l’illustrent :
| id | key | name | gender | age0 | age1 | age2 |
|---|---|---|---|---|---|---|
| 1 | name | Emma Williams | ||||
| 1 | gender | F | ||||
| 1 | age1 | 82.46 | ||||
| 1 | age2 | 91.76 | ||||
| 2 | name | Aiden Jones | ||||
| 2 | gender | F | ||||
| 2 | age0 | 69.76 | ||||
| 2 | age1 | 79.89 | ||||
| 3 | name | Emma Williams | ||||
| 3 | gender | F | ||||
| 3 | age1 | 82.46 | ||||
| 3 | age2 | 91.76 |
| id | name | gender | age0 | age1 | age2 |
|---|---|---|---|---|---|
| 1 | Emma Williams | ||||
| 1 | F | ||||
| 1 | 82.46 | ||||
| 1 | 91.76 | ||||
| 2 | Aiden Jones | ||||
| 2 | F | ||||
| 2 | 69.76 | ||||
| 2 | 79.89 | ||||
| 3 | Emma Williams | ||||
| 3 | F | ||||
| 3 | 82.46 | ||||
| 3 | 91.76 |
| id | name | gender | age0 | age1 | age2 |
|---|---|---|---|---|---|
| 1 | Emma Williams | F | 82.46 | 91.76 | |
| 1 | |||||
| 1 | |||||
| 1 | |||||
| 2 | Aiden Jones | F | 69.76 | 79.89 | |
| 2 | |||||
| 2 | |||||
| 2 | |||||
| 3 | Emma Williams | F | 82.46 | 91.76 | |
| 3 | |||||
| 3 | |||||
| 3 |
| id | name | gender | age0 | age1 | age2 |
|---|---|---|---|---|---|
| 1 | Emma Williams | F | 82.46 | 91.76 | |
| 2 | Aiden Jones | F | 69.76 | 79.89 | |
| 3 | Emma Williams | F | 82.46 | 91.76 |
L’élément clé, pour passer du large au long, est de décider quelles colonnes seront fusionnées dans une seule.
Mais il n’est pas obligatoire de n’utiliser qu’une seule colonne cible ; vous pouvez en utiliser deux si nécessaire, comme dans le tableau ci-dessous :
| name | gender | h2011 | h2012 | w2011 | w2012 |
|---|---|---|---|---|---|
| Jackson Smith | M | 74.69 | 84.99 | 9.60 | 12.0 |
| Olivia Miller | F | NA | 80.76 | 7.15 | 10.7 |
| Ava Wilson | F | 88.77 | 96.45 | NA | 15.0 |
Savez-vous le convertir au format long ?
Les colonnes h2011, h2012, w2011, w2012 correspondent aux tailles et aux poids en 2011 et 2012. height et weight sont de natures différentes (cm, kg). Vous pouvez regrouper ces mesures dans une seule colonne ou en conserver deux distinctes, comme ici :
| name | gender | year | height | weight |
|---|---|---|---|---|
| Jackson Smith | M | 2011 | 74.69 | 9.60 |
| Jackson Smith | M | 2012 | 84.99 | 12.00 |
| Olivia Miller | F | 2011 | NA | 80.76 |
| Olivia Miller | F | 2012 | 7.15 | 10.70 |
| Ava Wilson | F | 2011 | 88.77 | 96.45 |
| Ava Wilson | F | 2012 | NA | 15.00 |
S’agit-il d’un format long ou d’un format large ?
Passer du long au large dans R
Effectuons la conversion entre formats long et large avec R. De nombreuses fonctions et extensions existent pour cela.
| func | package | to_long_form | to_wide_form |
|---|---|---|---|
| stack/unstack | utils | stack | unstack |
| reshape | stats | reshape(direction="long", ...) | reshape(direction="wide", ...) |
| melt/dcast | reshape2 | melt | dcast |
| gather/spread | tidyr | gather | spread |
Ici, nous allons utiliser melt() et dcast() de l’extension reshape2. Pourquoi ? stack() et unstack() sont des fonctions de base qui nécessitent souvent un post-traitement. Notez que gather() et spread() de tidyr sont aussi très populaires, mais ne sont pas couverts ici.
Vous pouvez également utiliser reshape() du package stats. Attention à ne pas confondre avec le package reshape ! Ce dernier, tout comme reshape2, a été développé pour simplifier la vie de ceux qui peinaient avec reshape(). En outre, reshape() suppose souvent des données longitudinales (mesures répétées dans le temps).
Convertissons les données du tableau 35 en format long. Supposons que ce tableau est stocké dans un data.frame nommé dat.
| name | gender | year2011 | year2012 | year2013 |
|---|---|---|---|---|
| Jackson Smith | M | 74.69 | 84.99 | 91.73 |
| Emma Williams | F | NA | NA | 75.74 |
| Liam Brown | M | 88.24 | NA | 101.85 |
| Ava Wilson | F | 88.77 | 96.45 | NA |
babies = data.frame(name= c("Jackson Smith", "Emma Williams", "Liam Brown", "Ava Wilson"), gender = c("M", "F", "M", "F"), year2011= c(74.69, NA, 88.24, 88.77), year2012=c(84.99, NA, NA, 96.45), year2013=c(91.73, 75.74, 101.83, NA)) babies
## name gender year2011 year2012 year2013
## 1 Jackson Smith M 74.69 84.99 91.73
## 2 Emma Williams F NA NA 75.74
## 3 Liam Brown M 88.24 NA 101.83
## 4 Ava Wilson F 88.77 96.45 NA
La question à se poser : "quelles colonnes regrouper en une seule ?".
Ce sont ici year2011, year2012, year2013. Avec melt(), listez-les dans measure.vars :
melt(babies, measure.vars = c("year2011", "year2012", "year2013"))
## name gender variable value
## 1 Jackson Smith M year2011 74.69
## 2 Emma Williams F year2011 NA
## 3 Liam Brown M year2011 88.24
## 4 Ava Wilson F year2011 88.77
## 5 Jackson Smith M year2012 84.99
## 6 Emma Williams F year2012 NA
## 7 Liam Brown M year2012 NA
## 8 Ava Wilson F year2012 96.45
## 9 Jackson Smith M year2013 91.73
## 10 Emma Williams F year2013 75.74
## 11 Liam Brown M year2013 101.83
## 12 Ava Wilson F year2013 NA
year2011, year2012, year2013 sont les colonnes placées en 3e, 4e, 5e position, vous pouvez donc utiliser :
melt(babies, measure.vars = 3:5)
## name gender variable value
## 1 Jackson Smith M year2011 74.69
## 2 Emma Williams F year2011 NA
## 3 Liam Brown M year2011 88.24
## 4 Ava Wilson F year2011 88.77
## 5 Jackson Smith M year2012 84.99
## 6 Emma Williams F year2012 NA
## 7 Liam Brown M year2012 NA
## 8 Ava Wilson F year2012 96.45
## 9 Jackson Smith M year2013 91.73
## 10 Emma Williams F year2013 75.74
## 11 Liam Brown M year2013 101.83
## 12 Ava Wilson F year2013 NA
Le résultat est dans le tableau ci-dessus. Notez les noms de colonnes variable et value. Les tableaux 23 et 24 montraient que de nouveaux noms de colonnes sont nécessaires. La fonction melt() utilise des noms par défaut - variable et value. Vous pouvez les remplacer en utilisant les arguments variable.name= et value.name=. Faisons-le ci-dessous :
melt(babies, measure.vars=3:5, variable.name="year", value.name="height")
## name gender year height
## 1 Jackson Smith M year2011 74.69
## 2 Emma Williams F year2011 NA
## 3 Liam Brown M year2011 88.24
## 4 Ava Wilson F year2011 88.77
## 5 Jackson Smith M year2012 84.99
## 6 Emma Williams F year2012 NA
## 7 Liam Brown M year2012 NA
## 8 Ava Wilson F year2012 96.45
## 9 Jackson Smith M year2013 91.73
## 10 Emma Williams F year2013 75.74
## 11 Liam Brown M year2013 101.83
## 12 Ava Wilson F year2013 NA
Les mesures ont été spécifiées dans les exemples ci-dessus. Pour les configurations que vous gérez, Id peut indirectement spécifier les mesures. Vous pouvez donc choisir des colonnes pour l'identifiant plutôt que pour les mesures.
Les résultats sont identiques pour les deux cas ci-dessous. Le premier choisit les colonnes pour l'identifiant, le second choisit les colonnes à regrouper :
melt(babies, id.vars=c("name","gender"))
melt(babies, measure.vars = c("year2011", "year2012", "year2013"))
## name gender variable value
## 1 Jackson Smith M year2011 74.69
## 2 Emma Williams F year2011 NA
## 3 Liam Brown M year2011 88.24
## 4 Ava Wilson F year2011 88.77
## 5 Jackson Smith M year2012 84.99
## 6 Emma Williams F year2012 NA
## 7 Liam Brown M year2012 NA
## 8 Ava Wilson F year2012 96.45
## 9 Jackson Smith M year2013 91.73
## 10 Emma Williams F year2013 75.74
## 11 Liam Brown M year2013 101.83
## 12 Ava Wilson F year2013 NA
Si vous spécifiez à la fois id.vars et measure.vars, les colonnes non incluses dans l'un ou l'autre sont exclues du résultat. Par exemple, regardez le bloc de code ci-dessous :
melt(babies, id.vars=c("name"), measure.vars=c("year2011", "year2012"))
## name variable value
## 1 Jackson Smith year2011 74.69
## 2 Emma Williams year2011 NA
## 3 Liam Brown year2011 88.24
## 4 Ava Wilson year2011 88.77
## 5 Jackson Smith year2012 84.99
## 6 Emma Williams year2012 NA
## 7 Liam Brown year2012 NA
## 8 Ava Wilson year2012 96.45
De plus, na.rm=T peut éliminer les NA :
melt(babies, id.vars=c("name"), measure.vars=c("year2011", "year2012"), na.rm=T)
## name variable value
## 1 Jackson Smith year2011 74.69
## 3 Liam Brown year2011 88.24
## 4 Ava Wilson year2011 88.77
## 5 Jackson Smith year2012 84.99
## 8 Ava Wilson year2012 96.45
La fonction dcast() fait l'inverse de melt(). id, variable et value sont les colonnes du format le plus long. dcast(data, id ~ variable, value.var="value") transforme le format le plus long en format large.
babiesLong <- melt(babies, id.vars=c("name"), measure.vars=c("year2011", "year2012"), na.rm=T)
babiesLong
## name variable value
## 1 Jackson Smith year2011 74.69
## 3 Liam Brown year2011 88.24
## 4 Ava Wilson year2011 88.77
## 5 Jackson Smith year2012 84.99
## 8 Ava Wilson year2012 96.45
babiesLong a name pour id, variable pour variable, et value pour value. Vous pouvez donc utiliser dcast() pour le transformer en format long :
dcast(babiesLong, name ~ variable, value.var="value")
## name year2011 year2012
## 1 Ava Wilson 88.77 96.45
## 2 Jackson Smith 74.69 84.99
## 3 Liam Brown 88.24 NA
Conclusion
C'est à peu près tout. Dans ce tutoriel, vous vous êtes concentré sur la compréhension de la logique et du processus de remodelage des données. Habituellement, le format long est préféré pour l'analyse, mais il existe des exceptions. La présentation des données au format large peut économiser de l'espace lorsque cela est approprié, mais à mesure que le nombre de valeurs manquantes augmente, il vaut mieux convertir au format long.
Pour la conversion de format, vous devez vous concentrer sur ce que sont les mesures. La devise du format long est une mesure par ligne, et le format large a plusieurs mesures par ligne. Lorsque vous regroupez des mesures dans une seule colonne, les noms de colonnes d'origine doivent être préservés dans une colonne supplémentaire. Lorsque vous étalez des mesures d'une colonne sur plusieurs colonnes, vous devez déterminer quels doivent être les noms de colonnes à partir de la colonne variable.
Une fois que vous avez compris le processus, l'utilisation de fonctions telles que dcast() et melt() devient beaucoup plus facile !