2016-08-21 6 views
0

Ich habe einen Datenrahmen, wie diese aufgebaut ist:lang breit mit dplyr

dd <- data.frame(round = c("round1", "round2", "round1", "round2"), 
       var1 = c(22, 11, 22, 11), 
       var2 = c(33, 44, 33, 44), 
       nam = c("foo", "foo", "bar", "bar"), 
       val = runif(4)) 

    round var1 var2 nam  val 
1 round1 22 33 foo 0.32995729 
2 round2 11 44 foo 0.89215038 
3 round1 22 33 bar 0.09213526 
4 round2 11 44 bar 0.82644723 

Daraus würde Ich mag einen Datenrahmen mit zwei Linien zu erhalten, einem für jeden Wert von nam und Variablen var1_round1, var1_round2, var2_round1, var2_round2, val_round1, val_round2. Ich würde wirklich gerne eine dplyr Lösung zu diesem finden.

nam var1_round1 var1_round2 var2_round1 var2_round2 val_round1 val_round2 
1 foo   22   11   33   44 0.32995729 0.8921504 
2 bar   22   11   33   44 0.09213526 0.8264472 

Das nächste, was ich denken kann, wäre spread() in irgendeiner Art und Weise kreativ zu verwenden, aber ich kann nicht scheinen, um es herauszufinden.

Antwort

4

Wir können dazu tidyr/dplyr verwenden. Wir gather das Dataset zu 'Long' Format, unite die 'Variable' und 'Runde', um 'var' zu erstellen und dann spread auf 'Wide' Format.

library(dplyr) 
library(tidyr) 
gather(dd, variable, value, var1, var2, val) %>% 
     unite(var, variable, round) %>% 
     spread(var, value) 
# nam val_round1 val_round2 var1_round1 var1_round2 var2_round1 var2_round2 
#1 bar 0.7187271 0.6022287   22   11   33   44 
#2 foo 0.2672339 0.7199101   22   11   33   44 

HINWEIS: Die 'val' verschieden sind wie die OP kein seed für runif

gesetzt haben