Le remodelage de données.cadre large format long
J'ai du mal à convertir mon data.frame
à partir d'une grande table à une longue table.
Pour le moment, il 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 cette data.frame
dans un long data.frame
.
Quelque chose comme ceci:
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
J'ai regardé et déjà essayé d'utiliser le melt()
et la reshape()
fonctions
comme certaines personnes ont en suggérant des questions similaires.
Cependant, jusqu'à présent, je seulement obtenir malpropre résultats.
Si c'est possible, je voudrais le faire avec le reshape()
fonction depuis
il a l'air un peu plus agréable à manipuler.
- Ne sais pas si c'était le problème, mais les fonctions dans le remodeler paquet de fonte et de coulée (et à la refonte.)
- Et le remodeler paquet a été remplacé par reshape2.
- Et maintenant reshape2 a été remplacé par tidyr.
Vous devez vous connecter pour publier un commentaire.
reshape()
prend un certain temps pour se utilisé pour, commemelt
/cast
. Voici une solution avec les remodeler, en supposant que votre bloc de données est appeléd
:Trois solutions:
1: Avec
reshape2
donner:
Une alternative de notations qui donnent le même résultat:
2: Avec
data.table
Vous pouvez utiliser le même
melt
de la fonction que dans lereshape2
paquet (qui est une longue & l'amélioration de la mise en œuvre).melt
dedata.table
a également plus de paramètres que lemelt
fonction dereshape2
. Vous pouvez par exemple spécifier le nom de la variable de la colonne:Certaines autres notations:
3: Avec
tidyr
Certaines autres notations:
Si vous souhaitez exclure
NA
valeurs, vous pouvez ajouterna.rm = TRUE
à lamelt
ainsi que lagather
fonctions.Un autre problème avec les données, les valeurs seront lus par R en tant que personnage-valeurs (suite de la
,
dans les chiffres). Vous pouvez les réparer avecgsub
etas.numeric
:Ou directement avec
data.table
oudplyr
:De données:
id
ettime
dans votre bloc de données,melt
ne pouvait pas dire ce que vous voulez faire dans ce cas.id.vars
et lameasure.vars
.id.vars
et lameasure.vars
peut être spécifié dans la première variante,désolé pour le désordre, ses de ma faute.À l'aide de remodeler package:
Depuis cette réponse, c'est taggés avec r-faq, j'ai pensé qu'il serait utile de partager une autre alternative à partir de la base de R:
stack
.Noter, cependant, que
stack
ne fonctionne pas avecfactor
s--il ne fonctionne que siis.vector
estTRUE
, et à partir de la documentation pouris.vector
, nous constatons que:Je suis en utilisant les données de l'échantillon à partir de @Jaap de réponse, où les valeurs dans l'année colonnes sont
factor
s.Voici la
stack
approche:Voici un autre exemple montrant l'utilisation de
gather
detidyr
. Vous pouvez sélectionner les colonnes àgather
en supprimant individuellement (comme je le fais ici), ou en incluant les ans, vous voulez explicitement.Noter que, pour gérer les virgules (et X est ajouté si
check.names = FALSE
n'est pas défini), je suis également en utilisantdplyr
's muter avecparse_number
dereadr
pour convertir le texte les valeurs des nombres. Ce sont tous partie de latidyverse
et donc, peuvent être chargés aveclibrary(tidyverse)
Retourne:
Voici un sqldf la solution:
Pour rendre la requête sans avoir à taper dans tous les éléments, vous pouvez utiliser les éléments suivants:
Merci pour G. Grothendieck pour la mettre en œuvre.
Malheureusement, je ne pense pas que
PIVOT
etUNPIVOT
serait travailler pourR
SQLite
. Si vous voulez écrire votre requête de manière plus sophistiquée, vous pouvez également prendre un coup d'oeil à ces postes:À l'aide de
sprintf
à l'écriture de requêtes sql Ou Passer des variables àsqldf
Avec
tidyr_1.0.0
, une autre option estpivot_longer
de données