R Language
Remaniement des données entre formes longues et larges
Recherche…
Introduction
Dans R, les données tabulaires sont stockées dans des trames de données . Cette rubrique couvre les différentes manières de transformer une seule table.
Remarques
Forfaits utiles
- Remodeler, empiler et diviser avec data.table
- Remodeler en utilisant tidyr
- splitstackshape
La fonction de remodelage
La fonction de base R la plus flexible pour remodeler les données est le reshape
. Voir ?reshape
pour sa syntaxe.
# create unbalanced longitudinal (panel) data set
set.seed(1234)
df <- data.frame(identifier=rep(1:5, each=3),
location=rep(c("up", "down", "left", "up", "center"), each=3),
period=rep(1:3, 5), counts=sample(35, 15, replace=TRUE),
values=runif(15, 5, 10))[-c(4,8,11),]
df
identifier location period counts values
1 1 up 1 4 9.186478
2 1 up 2 22 6.431116
3 1 up 3 22 6.334104
5 2 down 2 31 6.161130
6 2 down 3 23 6.583062
7 3 left 1 1 6.513467
9 3 left 3 24 5.199980
10 4 up 1 18 6.093998
12 4 up 3 20 7.628488
13 5 center 1 10 9.573291
14 5 center 2 33 9.156725
15 5 center 3 11 5.228851
Notez que le data.frame est déséquilibré, c'est-à-dire que l'unité 2 manque une observation dans la première période, alors que les unités 3 et 4 manquent d'observations dans la deuxième période. Notez également qu'il existe deux variables qui varient au cours des périodes: les comptes et les valeurs, et les deux autres qui ne varient pas: identificateur et emplacement.
Long à large
Pour remodeler le data.frame au format large,
# reshape wide on time variable
df.wide <- reshape(df, idvar="identifier", timevar="period",
v.names=c("values", "counts"), direction="wide")
df.wide
identifier location values.1 counts.1 values.2 counts.2 values.3 counts.3
1 1 up 9.186478 4 6.431116 22 6.334104 22
5 2 down NA NA 6.161130 31 6.583062 23
7 3 left 6.513467 1 NA NA 5.199980 24
10 4 up 6.093998 18 NA NA 7.628488 20
13 5 center 9.573291 10 9.156725 33 5.228851 11
Notez que les périodes de temps manquantes sont remplies par les AN.
En remodelant la largeur, l'argument "v.names" spécifie les colonnes qui varient dans le temps. Si la variable d'emplacement n'est pas nécessaire, elle peut être supprimée avant le remaniement avec l'argument "drop". En supprimant la seule colonne non-variable / non-id du data.frame, l'argument v.names devient inutile.
reshape(df, idvar="identifier", timevar="period", direction="wide",
drop="location")
Large à long
Pour remodeler longtemps avec le courant df.wide, une syntaxe minimale est
reshape(df.wide, direction="long")
Cependant, ceci est généralement plus difficile:
# remove "." separator in df.wide names for counts and values
names(df.wide)[grep("\\.", names(df.wide))] <-
gsub("\\.", "", names(df.wide)[grep("\\.", names(df.wide))])
Maintenant, la syntaxe simple produira une erreur sur les colonnes non définies.
Avec des noms de colonnes plus difficiles à analyser automatiquement par la fonction reshape
, il est parfois nécessaire d'ajouter l'argument "variable" qui indique à reshape
pour regrouper des variables particulières au format large pour la transformation au format long. Cet argument prend une liste de vecteurs de noms de variables ou d'indices.
reshape(df.wide, idvar="identifier",
varying=list(c(3,5,7), c(4,6,8)), direction="long")
En remodelant longtemps, l'argument "v.names" peut être fourni pour renommer les variables variables résultantes.
Parfois, la spécification de "variant" peut être évitée en utilisant l'argument "sep" qui indique comment reshape
quelle partie du nom de la variable spécifie l'argument value et qui spécifie l'argument time.
Remodelage des données
Les données sont souvent dans des tableaux. Généralement, on peut diviser ces données tabulaires en formats larges et longs. Dans un format large, chaque variable a sa propre colonne.
La personne | Hauteur (cm] | Âge [année] |
---|---|---|
Alison | 178 | 20 |
Bob | 174 | 45 |
Carl | 182 | 31 |
Cependant, il est parfois plus pratique d’avoir un format long, dans lequel toutes les variables sont dans une colonne et les valeurs dans une seconde colonne.
La personne | Variable | Valeur |
---|---|---|
Alison | Hauteur (cm] | 178 |
Bob | Hauteur (cm] | 174 |
Carl | Hauteur (cm] | 182 |
Alison | Âge [année] | 20 |
Bob | Âge [année] | 45 |
Carl | Âge [année] | 31 |
Base R, ainsi que les packages tiers peuvent être utilisés pour simplifier ce processus. Pour chacune des options, le mtcars
données mtcars
sera utilisé. Par défaut, cet ensemble de données est dans un format long. Pour que les packages fonctionnent, nous allons insérer les noms de lignes comme première colonne.
mtcars # shows the dataset
data <- data.frame(observation=row.names(mtcars),mtcars)
Base r
Il y a deux fonctions dans la base R qui peuvent être utilisées pour convertir entre le format large et le format long: stack()
et unstack()
.
long <- stack(data)
long # this shows the long format
wide <- unstack(long)
wide # this shows the wide format
Cependant, ces fonctions peuvent devenir très complexes pour les cas d'utilisation plus avancés. Heureusement, il existe d'autres options utilisant des packages tiers.
Le paquet tidyr
Ce package utilise gather()
pour convertir de large à long et spread()
pour convertir de long à large.
library(tidyr)
long <- gather(data, variable, value, 2:12) # where variable is the name of the
# variable column, value indicates the name of the value column and 2:12 refers to
# the columns to be converted.
long # shows the long result
wide <- spread(long,variable,value)
wide # shows the wide result (~data)
Le package data.table
Le package data.table étend les fonctions reshape2
et utilise la fonction melt()
pour passer de large à long et dcast()
pour passer de long à large.
library(data.table)
long <- melt(data,'observation',2:12,'variable', 'value')
long # shows the long result
wide <- dcast(long, observation ~ variable)
wide # shows the wide result (~data)