2016-11-26 4 views
2

Je sais reshape de la base R peut convertir en un format long où le temps est imputée à partir des noms de variables stub A et B, par exemple:reshape2 et larges (imputées) variables de temps

wide = data.frame(A.2010 = c('a', 'b', 'c'), 
        A.2011 = c('f', 'g', 'd'), 
        B.2010 = c('A', 'B', 'C'), 
        B.2011 = c('G', 'G', 'H'), 
        z = runif(3), 
        x = runif(3)) 

wide 
# A.2010 A.2011 B.2010 B.2011   z   x 
#1  a  f  A  G 0.3626823 0.67212468 
#2  b  g  B  G 0.3726911 0.09663248 
#3  c  d  C  H 0.9807237 0.31259394 

Devient:

reshape(wide, direction = 'long', sep = '.', 
     varying = c('A.2010', 'A.2011', 'B.2010', 'B.2011')) 
#    z   x time A B id 
#1.2010 0.3626823 0.67212468 2010 a A 1 
#2.2010 0.3726911 0.09663248 2010 b B 2 
#3.2010 0.9807237 0.31259394 2010 c C 3 
#1.2011 0.3626823 0.67212468 2011 f G 1 
#2.2011 0.3726911 0.09663248 2011 g G 2 
#3.2011 0.9807237 0.31259394 2011 d H 3 

Puis-je accomplir la même chose avec reshape2::melt?

Répondre

2

Il semble que reshape dans la base r est le meilleur outil pour ce faire, car il n'y a pas de fonctionnalité similaire dans la fonction melt du paquet reshape2. Cependant, vous pouvez obtenir quelque chose de similaire avec la fonction patterns dans melt.data.table:

library(reshape2) 
library(data.table) 

wide = data.table(wide) 

long = melt(wide, id.vars = c("z", "x"), measure = patterns("^A", "^B"), 
      value.name = c("A", "B"), variable.name = "time") 

> long 
      z   x time A B 
1: 0.3421681 0.8432707 1 a A 
2: 0.1243282 0.5096108 1 b B 
3: 0.3650165 0.1441660 1 c C 
4: 0.3421681 0.8432707 2 f G 
5: 0.1243282 0.5096108 2 g G 
6: 0.3650165 0.1441660 2 d H 

Notez que melt reconnaît la variation « temps » et les groupes correctement, mais ne pas utiliser 2010 et 2011 comme vous le souhaitez. Une solution de contournement consiste à recoder les niveaux manuellement, ce qui devrait être trivial.

levels(long$time) = c("2010", "2011") 

> long 
      z   x time A B 
1: 0.3421681 0.8432707 2010 a A 
2: 0.1243282 0.5096108 2010 b B 
3: 0.3650165 0.1441660 2010 c C 
4: 0.3421681 0.8432707 2011 f G 
5: 0.1243282 0.5096108 2011 g G 
6: 0.3650165 0.1441660 2011 d H 

J'espère que cela aide!