2017-09-24 12 views
1

Problème

J'ai 3 voitures (variable de regroupement) pour lesquelles les vitesses dans le temps sont enregistrées dans l'ensemble de données suivant. Je veux transposer ce cadre de données par groupe.Comment transposer une trame de données par groupe en utilisant la bibliothèque reshape2?

données

foo <- structure(list(file.ID2 = c("Cars_03", "Cars_03", "Cars_03", 
"Cars_03", "Cars_03", "Cars_03", "Cars_03", "Cars_03", "Cars_04", 
"Cars_04", "Cars_04", "Cars_04", "Cars_04", "Cars_04", "Cars_04", 
"Cars_04", "Cars_05", "Cars_05", "Cars_05", "Cars_05", "Cars_05", 
"Cars_05", "Cars_05", "Cars_05"), speed.kph.ED = c(129.3802848, 
129.4022304, 129.424176, 129.4461216, 129.4680672, 129.47904, 
129.5009856, 129.5229312, 127.8770112, 127.8221472, 127.7672832, 
127.7124192, 127.6575552, 127.6026912, 127.5478272, 127.4929632, 
134.1095616, 134.1205344, 134.1315072, 134.1534528, 134.1644256, 
134.1753984, 134.1863712, 134.197344)), row.names = c(NA, -24L 
), class = c("tbl_df", "tbl", "data.frame"), .Names = c("file.ID2", 
"speed.kph.ED")) 

désiré Sortie

> foo 
       V2  V3  V4  V5  V6  V7  V8  V9 
Cars_03 129.3803 129.4022 129.4242 129.4461 129.4681 129.4790 129.5010 129.5229 
Cars_04 127.8770 127.8221 127.7673 127.7124 127.6576 127.6027 127.5478 127.4930 
Cars_05 134.1096 134.1205 134.1315 134.1535 134.1644 134.1754 134.1864 134.1973 

Ce que j'ai essayé

Après beaucoup de recherches, je trouve que la bibliothèque reshape2 peut être utile. J'ai trouvé ce question qui semble être pertinent. Donc, j'ai essayé d'utiliser melt() et dcast() fonctionne comme suit:

library(reshape2) 
dcast(melt(foo,id.vars = 1), 
     file.ID2 ~ variable, NULL) 
Aggregation function missing: defaulting to length 
    file.ID2 speed.kph.ED 
1 Cars_03   8 
2 Cars_04   8 
3 Cars_05   8 

Mais ce juste agrège les valeurs (compte/somme). S'il vous plaît, aidez-moi à obtenir la sortie désirée. Merci.

+2

Sans paquets, cela fonctionne: 'avec (foo, as.data.frame (t (sapply (split (speed.kph.ED, fichier.ID2), t))))' Omettre 'as.data.frame' est le résultat de la matrice est ok. –

Répondre

2

Pour le remodelage des données, j'aime utiliser la fonction spread de la bibliothèque .

D'abord, ajoutez une colonne id. Il y a un milliard de différentes façons de le faire (je préfère utiliser le paquet dplyr):

library(dplyr) 
foo = foo %>% group_by(file.ID2) %>% mutate(id = paste0("V",row_number())) 

Et voici comment utiliser la bibliothèque tidyr-spread les données sur:

library(tidyr) 
answer = spread(data = foo, key = id, value = speed.kph.ED)