Reshape long

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

Aurélien Madouasse
Messages : 352
Enregistré le : 26 Fév 2007, 11:23

Reshape long

Messagepar Aurélien Madouasse » 07 Mar 2012, 10:45

Bonjour,

J'ai un jeu de données qui ressemble à ça:

Code : Tout sélectionner

set.seed(123)
Wide <- as.data.frame(
         cbind(1:5,
              matrix(sample(1:30), ncol = 6)))

colnames(Wide) <- c("ID", paste("X", 1:3, sep = ""), paste("Z", 1:3, sep = ""))

Wide
  ID X1 X2 X3 Z1 Z2 Z3
1  1  9  2 20 14 19  8
2  2 23 13 30  4  7  3
3  3 12 21 22  1  6 16
4  4 24 27 29 15 17 18
5  5 25 10 26 11 28  5


Je veux le transformer pour obtenir une ligne pour chaque combinaison X_n/Z_n.

Code : Tout sélectionner

Long1 <- reshape(Wide[, c("ID", "X1", "X2", "X3")], direction = "long",
                idvar = "ID",
                varying = list(2:4))

Long2 <- reshape(Wide[, c("ID", "Z1", "Z2", "Z3")], direction = "long",
                 idvar = "ID",
                 varying = list(2:4))

Long <- merge(Long1, Long2)

Long
   ID time  X  Z
1   1    1  9 14
2   1    2  2 19
3   1    3 20  8
4   2    1 23  4
5   2    2 13  7
6   2    3 30  3
7   3    1 12  1
8   3    2 21  6
9   3    3 22 16
10  4    1 24 15
11  4    2 27 17
12  4    3 29 18
13  5    1 25 11
14  5    2 10 28
15  5    3 26  5


Sachant que j'ai pas mal de variables dans mon tableau, quelqu'un aurait-il une solution plus simple à mettre en œuvre que ce qui est écrit plus haut? Je ne vois pas comment faire avec la fonction reshape ou les fonctions décrites dans le package reshape.

Merci d'avance,

Aurélien

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Messagepar Logez Maxime » 07 Mar 2012, 12:55

Bonjour,

tu peux essayé ça :

Code : Tout sélectionner

lg <- reshape(Wide, direction="long", varying=list(2:4,5:7), idvar="ID")
lg <- lg[order(lg$ID),]

Maxime

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Messagepar Logez Maxime » 07 Mar 2012, 13:00

Si tu veux pourvoir généraliser ton code tu peux aussi faire ça :

Code : Tout sélectionner

fac <- factor(substring(colnames(Wide)[-1],1,1))
fac <- split(2:ncol(Wide), fac)
lg <- reshape(Wide, direction="long", varying=fac, idvar="ID")
lg <- lg[order(lg[,1]),]
Maxime

dicko ahmadou
Messages : 444
Enregistré le : 21 Nov 2009, 20:15

Messagepar dicko ahmadou » 07 Mar 2012, 13:47

Bonjour

Tu peux utiliser l'argument sep ça facilite la syntaxe :

Code : Tout sélectionner

R> reshape(Wide, varying = c(paste("X", 1:3, sep = ""), paste("Z", 1:3, sep = "")), direction = "long", idvar = "ID", sep = "")
    ID time  X  Z
1.1  1    1  9 14
2.1  2    1 23  4
3.1  3    1 12  1
4.1  4    1 24 15
5.1  5    1 25 11
1.2  1    2  2 19
2.2  2    2 13  7
3.2  3    2 21  6
4.2  4    2 27 17
5.2  5    2 10 28
1.3  1    3 20  8
2.3  2    3 30  3
3.3  3    3 22 16
4.3  4    3 29 18
5.3  5    3 26  5


Ensuite comme Maxime l'a fait tu peux ordonner selon a colonne ID.
The best thing about being a statistician is that you get to play in everyone's backyard.
John Tukey

Aurélien Madouasse
Messages : 352
Enregistré le : 26 Fév 2007, 11:23

Messagepar Aurélien Madouasse » 07 Mar 2012, 13:59

Merci à vous 2 pour ces solutions. Sur 700 colonnes, ça aurait été lourd de tout faire à la main.
Aurélien

Aurélien Madouasse
Messages : 352
Enregistré le : 26 Fév 2007, 11:23

Messagepar Aurélien Madouasse » 10 Mar 2012, 12:16

Bon, j'ai réussi à adapter le code à mon problème. Je le mets ici au cas où ça pourrait servir à quelqu'un.

Pour chaque ligne, j'ai 5 individus. Le noms des variables associées commencent par C1. pour l'individu 1 à C5. pour l'individu 5.

Données:

Code : Tout sélectionner

BNP
  id      C1.ID      C2.ID      C3.ID      C4.ID      C5.ID C1.Breed C2.Breed C3.Breed
2 90 7124891876 7124891930 7124891934 7124891875                  38       38       38
3 92 7123791460 7123791459 7123791461 7123791462 7123791463       38       38       38
4 94 8530756240 8530756238 8530756239                          66*46    66*46       66

  C4.Breed C5.Breed C1.Sex C2.Sex C3.Sex C4.Sex C5.Sex
2       38               M      F      F      M       
3       38       38      M      M      M      M      M
4                        F      F      F             


Reshape:

Code : Tout sélectionner

ls.names <- colnames(BNP)[grep("C1.", colnames(BNP))]
ls.names <- gsub("C1.", "", ls.names)

l.ind <- lapply(as.list(ls.names), function(x){
  grep(
    paste("^C[1-5]\\.", x,"$", sep = ""),
    colnames(BNP))
})

CLV <- reshape(BNP,
               varying = l.ind,
               direction = "long", idvar = "id", sep = "")

CLV
     id time      C1.ID C1.Breed C1.Sex
90.1 90    1 7124891876       38      M
90.2 90    2 7124891930       38      F
90.3 90    3 7124891934       38      F
90.4 90    4 7124891875       38      M
90.5 90    5                           
92.1 92    1 7123791460       38      M
92.2 92    2 7123791459       38      M
92.3 92    3 7123791461       38      M
92.4 92    4 7123791462       38      M
92.5 92    5 7123791463       38      M
94.1 94    1 8530756240    66*46      F
94.2 94    2 8530756238    66*46      F
94.3 94    3 8530756239       66      F
94.4 94    4                           
94.5 94    5     


Aurélien

Elodie AUMAITRE
Messages : 4
Enregistré le : 01 Fév 2018, 15:05

Re: Reshape long

Messagepar Elodie AUMAITRE » 19 Juil 2018, 14:25

Bonjour,
je vous remercie pour cet exemple qui m'a servi. Je recherche une amélioration : j'obtiens le résultat attendu mais j'aimerai faire disparaître le C1. devant le nom des nouvelles colonnes (sur le CLV), comment indiquer cela à R ?
merci d'avance

Elodie

Bastien Gamboa
Messages : 151
Enregistré le : 13 Jan 2011, 21:31

Re: Reshape long

Messagepar Bastien Gamboa » 01 Aoû 2018, 09:09

Bonjour,

Essaie un

Code : Tout sélectionner

colnames(mydata) <- gsub(colnames(mydata), pattern="C1.", replacement="", fixed=TRUE)

HTH,
Bastien


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité