Comment changer les données entre les formats large et long en R? [fermé]

32

Vous pouvez avoir des données en format large ou en format long. C'est une chose assez importante, car les méthodes utilisables sont différentes, en fonction du format. Je sais que vous devez travailler avec melt()et à cast()partir du package de remodelage, mais il semble que certaines choses ne me soient pas parvenues.

Quelqu'un peut-il me donner un bref aperçu de la façon dont vous faites cela?

Mine
la source
Veuillez donner l'exemple de ce que vous voulez réaliser. Qu'est-ce que vous ne recevez pas exactement?
Mpiktas
3
Voici mon article de blog avec un exemple d'utilisation meltet cast. Là, la conversion du format large au format long se fait en une étape. Il n'y a vraiment rien de plus spécial.
Mpiktas
Bienvenue sur stats. Vous trouverez peut-être utile d'inclure un petit jeu de données reproductible dans votre question pour expliquer ce que vous voulez. Lisez sigmafield.org/2011/01/18/… pour plus.
PaulHurleyuk le
Voir cette question SO de nombreuses façons de le faire.
Axeman

Réponses:

26

Le site Web de Hadley Wickham contient plusieurs ressources sur le paquet (maintenant appelé reshape2), y compris un lien vers un article sur le paquet dans le Journal of Statistical Software.

Voici un bref exemple tiré du papier:

> require(reshape2)
Loading required package: reshape2
> data(smiths)
> smiths
     subject time age weight height
1 John Smith    1  33     90   1.87
2 Mary Smith    1  NA     NA   1.54

Nous notons que les données sont au format large. Pour aller à la forme longue, nous rendons le smithsbloc de données fondu :

> melt(smiths)
Using subject as id variables
     subject variable value
1 John Smith     time  1.00
2 Mary Smith     time  1.00
3 John Smith      age 33.00
4 Mary Smith      age    NA
5 John Smith   weight 90.00
6 Mary Smith   weight    NA
7 John Smith   height  1.87
8 Mary Smith   height  1.54

Remarquez comment vous avez melt()choisi l'une des variables comme id, mais nous pouvons indiquer explicitement laquelle utiliser via un argument 'id':

> melt(smiths, id = "subject")
     subject variable value
1 John Smith     time  1.00
2 Mary Smith     time  1.00
3 John Smith      age 33.00
4 Mary Smith      age    NA
5 John Smith   weight 90.00
6 Mary Smith   weight    NA
7 John Smith   height  1.87
8 Mary Smith   height  1.54

Voici un autre exemple tiré de ?cast:

#Air quality example
names(airquality) <- tolower(names(airquality))
aqm <- melt(airquality, id=c("month", "day"), na.rm=TRUE)

Si nous enregistrons la trame de données en fusion, nous pouvons jeter dans d' autres formes. Dans la nouvelle version reshape(appelé reshape2) il existe des fonctions acast()et dcast()renvoyer un résultat semblable à un tableau (tableau, matrice, vecteur) ou une trame de données respectivement. Ces fonctions prennent également une fonction d'agrégation (par exemple mean()) pour fournir des résumés de données sous forme fondue. Par exemple, à la suite de l'exemple de la qualité de l'air ci-dessus, nous pouvons générer, sous forme large, des valeurs moyennes mensuelles pour les variables de l'ensemble de données:

> dcast(aqm, month ~ variable, mean)
  month    ozone  solar.r      wind     temp
1     5 23.61538 181.2963 11.622581 65.54839
2     6 29.44444 190.1667 10.266667 79.10000
3     7 59.11538 216.4839  8.941935 83.90323
4     8 59.96154 171.8571  8.793548 83.96774
5     9 31.44828 167.4333 10.180000 76.90000

Il n'y a vraiment que deux fonctions principales reshape2: melt()et acast()et dcast()appariement. Regardez les exemples dans les pages d'aide pour ces deux fonctions, consultez le site Web de Hadley (lien ci-dessus) et consultez le document que j'ai mentionné. Cela devrait vous aider à démarrer.

Vous pouvez également regarder dans le plyrpaquet de Hadley qui fait des choses similaires reshape2mais qui est conçu pour en faire beaucoup plus.

Rétablir Monica - G. Simpson
la source
dcast(aqm, month ~ variable), qu'est-ce que cela ferait sans la fonction d'agrégation?
Qed
@CravingSpirit renvoie le nombre d'observations pour chaque variable. Lisez ?dcastce qui vous l'aurait dit (voir les détails de l'argument fun.aggregate).
Réintégrer Monica - G. Simpson
8
  • Quick-R a un exemple simple d'utilisation du paquetage reshape

  • Voir également ?reshape( LINK ) la manière dont la Base R permet de passer du format large au format long.

Jeromy Anglim
la source
7

Vous n'êtes pas obligé d'utiliser meltet cast.

Le remodelage des données peut être effectué de nombreuses manières. Dans votre exemple particulier sur votre cite, utiliser recastavec aggregateétait redondant car aggregatela tâche vous convient parfaitement toute seule.

aggregate(cbind(LPMVTUZ, LPMVTVC, LPMVTXC) ~ year, dtm, sum)
# or even briefer by first removing the columns you don't want to use
aggregate(. ~ year, dtm[,-2], sum)

J'aime bien comment, dans ton blog, tu expliques ce qui meltse passe. Très peu de gens comprennent cela et une fois que vous le voyez, il devient plus facile de voir comment cela castfonctionne et comment vous pourriez écrire vos propres fonctions si vous le souhaitez.

John
la source
2

Voir le wiki reshape2 . Il fournit sûrement plus d'exemples que vous pourriez attendre.

Stéphane Laurent
la source
2

Notant juste qu'il n'y a aucune référence aux méthodes de remodelage plus efficaces et plus complètes data.tableici, je poste donc sans autre commentaire l'excellente réponse de Zach / Arun sur StackOverflow pour une question similaire:

https://stackoverflow.com/questions/6902087/proper-fastest-way-to-reshape-a-data-table/6913151#6913151

Et notamment la merveilleuse vignette sur la data.tablepage GitHub:

https://github.com/Rdatatable/data.table/wiki/Getting-started

MichaelChirico
la source