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

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)


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow