J'ai du mal à convertir ma data.frame
table large en table longue. Pour le moment, cela ressemble à ceci:
Code Country 1950 1951 1952 1953 1954
AFG Afghanistan 20,249 21,352 22,532 23,557 24,555
ALB Albania 8,097 8,986 10,058 11,123 12,246
Maintenant, je voudrais transformer cela data.frame
en un long data.frame
. Quelque chose comme ça:
Code Country Year Value
AFG Afghanistan 1950 20,249
AFG Afghanistan 1951 21,352
AFG Afghanistan 1952 22,532
AFG Afghanistan 1953 23,557
AFG Afghanistan 1954 24,555
ALB Albania 1950 8,097
ALB Albania 1951 8,986
ALB Albania 1952 10,058
ALB Albania 1953 11,123
ALB Albania 1954 12,246
Je l' ai regardé et déjà essayé d' utiliser la melt()
et les reshape()
fonctions que certaines personnes ont laissé entendre dans des questions similaires. Cependant, jusqu'à présent je n'obtiens que des résultats désordonnés.
Si c'est possible, j'aimerais le faire avec la reshape()
fonction car elle semble un peu plus agréable à manipuler.
Réponses:
reshape()
prend un certain temps pour s'y habituer, tout commemelt
/cast
. Voici une solution avec remodelage, en supposant que votre bloc de données est appeléd
:la source
Trois solutions alternatives:
1) Avec data.table:
Vous pouvez utiliser la même
melt
fonction que dans lereshape2
package (qui est une implémentation étendue et améliorée).melt
fromdata.table
a également plus de paramètres que la fonctionmelt
-fonctionreshape2
. Vous pouvez par exemple également spécifier le nom de la variable-colonne:qui donne:
Quelques notations alternatives:
2) Avec tidyr:
Quelques notations alternatives:
3) Avec remodeler2:
Quelques notations alternatives qui donnent le même résultat:
REMARQUES:
NA
valeurs, vous pouvez ajouterna.rm = TRUE
auxmelt
fonctions ainsi qu'auxgather
fonctions.Un autre problème avec les données est que les valeurs seront lues par R en tant que valeurs de caractères (en conséquence de la
,
dans les nombres). Vous pouvez réparer cela avecgsub
etas.numeric
:Ou directement avec
data.table
oudplyr
:Les données:
la source
id
ettime
dans votre bloc de données,melt
ne pourrait pas dire ce que vous voulez faire dans ce cas.id.vars
et lemeasure.vars
.id.vars
et lemeasure.vars
peut être spécifié dans la première alternative, désolé pour le désordre, c'est ma faute.-c(var1, var2)
...-c(var1, var2)
il omet ces variables lors de la transformation des données du format large au format long.Utilisation du package reshape :
la source
Avec
tidyr_1.0.0
, une autre option estpivot_longer
Les données
la source
gather
est en train d'être retiré etpivot_longer
est maintenant la bonne façon d'accomplir cela.Puisque cette réponse est identifiée avec r-faq, Je pense qu'il serait utile de partager une autre alternative de la base R:
stack
.Notez cependant que
stack
cela ne fonctionne pas avecfactor
s - cela ne fonctionne que siis.vector
c'est le casTRUE
, et d'après la documentation deis.vector
, nous trouvons que:J'utilise les exemples de données de la réponse de @ Jaap , où les valeurs dans les colonnes de l'année sont
factor
s.Voici l'
stack
approche:la source
Voici un autre exemple montrant l'utilisation de
gather
fromtidyr
. Vous pouvez sélectionner les colonnesgather
soit en les supprimant individuellement (comme je le fais ici), soit en incluant les années que vous souhaitez explicitement.Notez que, pour gérer les virgules (et les X ajoutés si
check.names = FALSE
n'est pas défini), j'utilise égalementdplyr
mutate avecparse_number
fromreadr
pour convertir les valeurs de texte en nombres. Ceux-ci font tous partie dutidyverse
et peuvent donc être chargés aveclibrary(tidyverse)
Retour:
la source
Voici un sqldf Solution:
Pour effectuer la requête sans tout taper, vous pouvez utiliser ce qui suit:
Merci à G. Grothendieck pour sa mise en œuvre.
Malheureusement, je ne pense pas cela
PIVOT
etUNPIVOT
je travaillerais pourR
SQLite
. Si vous souhaitez rédiger votre requête de manière plus sophistiquée, vous pouvez également consulter ces articles:Utiliser l'
sprintf
écriture de requêtes SQL ou passer des variables àsqldf
la source
Vous pouvez également utiliser le
cdata
package, qui utilise le concept de table de contrôle (de transformation):J'explore actuellement ce package et je le trouve assez accessible. Il est conçu pour des transformations beaucoup plus compliquées et inclut la rétro-transformation. Il y a un tutoriel disponible.
la source