2015-12-08 2 views
1

J'ai une grande dataframe qui ressemble à ceci:R: remodelant large et à long

ID Time Amount  CabMean CabNum  PartMean PartNum  DinnMean DinNum Ex 
1 1 1 27 0.654621546  8   NA  7 0.316791872  6 0 
2 1 2 82 0.667461321  3 0.327594876  4 0.346798127  2 1 
3 1 3 52 0.313976132  1   NA  6 0.197837257  7 0 
4 1 4 99 0.798328712  9 0.913751678  4 0.191679538  9 1 

Je voudrais remodeler (en utilisant le package reshape2) à un long format qui prend cette forme (juste faire ces numéros):

ID Time Amount Ex Type Mean   Num 
1 1 2 50 0 Cab 0.65654321 7 
2 1 2 50 0 Part 0.65654321 1 
3 1 2 50 0 Dinn 0.65654321 4 

J'ai essayé quelque chose comme ceci:

reshaped <- melt(data, id.vars = c("ID", "Time", "Amount", "Ex")) 

ce qui me fait quelque chose comme t son:

ID Time Amount Ex variable value 
1 1 1 10 0 CabMean 0.6565432 
2 1 2 12 0 CabMean 0.6565432 

Donc je suis à peu près à mi-chemin et ne peux pas tout à fait comprendre le reste. Comment puis-je (soit à partir du code que j'utilise actuellement, soit à partir d'un code complètement nouveau) extraire le type (Cab, Part, Dinn) en tant que colonne séparée, et créer 2 colonnes supplémentaires contenant les valeurs Mean et Num?

+0

base 'reshape' peut le faire aussi:' remodeler (dat, IDVAR = c ("ID", "Time"), direction = "long", variable = liste (c (4,6,8), c (5,7,9)), times = c ("cab", "part", "dinn")) ' – thelatemail

Répondre

2

Nous pouvons utiliser melt de data.table qui peut prendre plusieurs colonnes measure avec l'argument pattern. Nous convertissons le 'data.frame' en 'data.table' (setDT(data)), puis melt au format 'long'.

library(data.table) 
DT <- melt(setDT(data), measure=patterns('Mean$', 'Num$'), 
       variable.name='Type', value.name=c('Mean', 'Num')) 
DT[, Type:=c('Cab', 'Part', 'Dinn')[Type]] 
+0

Comment renommez-vous les valeurs de la colonne Type à la bonne partie de l'étiquette de l'en-tête ? – Simon

+1

@Simon Vous pouvez soit 'gsub' à partir des noms de colonne et utiliser le type comme indicateur ou l'utiliser directement. J'ai mis à jour le post. – akrun