2015-03-19 4 views
10

Ich habe Daten, die in etwa so aussiehtLange bis breite Daten mit ordentlichR?

df = data.frame(name=c("A","A","B","B"), 
       group=c("g1","g2","g1","g2"), 
       V1=c(10,40,20,30), 
       V2=c(6,3,1,7)) 

ich es neu zu gestalten wollen wie folgt aussehen:

df = data.frame(name=c("A", "B"),    
       V1.g1=c(10,20), 
       V1.g2=c(40,30), 
       V2.g1=c(6,1), 
       V2.g2=c(3,7)) 

Ist es möglich, es mit tidyR zu tun?

Ich kann es mit reshape

reshape(df, idvar='name', timevar='group', direction='wide') 

aber ist immer gut, etwas Neues zu lernen.

Antwort

12

Der Code reshape ist kompakt, da er für Spalten mit mehreren Werten funktioniert. Die Verwendung desselben in tidyr, kann ein paar Schritte benötigen. Konvertieren Sie das Format 'Wide' in 'Long' unter Verwendung von gather, so dass es eine einzige Val-Spalte gibt, unite die Spalten 'Var' (aus dem vorherigen Schritt) und 'Gruppe', um eine einzelne 'VarG'-Spalte zu erstellen Verwenden Sie spread, um das Format "long" in "wide" umzuwandeln.

library(tidyr) 
gather(df, Var, Val, V1:V2) %>% 
        unite(VarG, Var, group) %>% 
        spread(VarG, Val) 
# name V1_g1 V1_g2 V2_g1 V2_g2 
#1 A 10 40  6  3 
#2 B 20 30  1  7 
+0

Der V1: V2 Teil war neu für mich. Wenn Sie V1 eingeben, filtern Sie auch Daten. Das ist nützlich. – jazzurro

+0

@jazzurro Ich denke für mehr Optionen, '' Select' von 'dplyr' wäre nützlich (d. H.' Starts_with, ends_with, ....) ' – akrun

+0

Vielen Dank für den Tipp. Ich werde ab jetzt die Auswahloptionen in 'gather()' anwenden. – jazzurro

9

dcast in data.table v1.9.5 + können mehrere value.var Spalten behandeln. So können wir tun:

require(data.table) # v1.9.5+ 
dcast(setDT(df), name ~ group, value.var=c("V1", "V2")) 
# name V1_g1 V1_g2 V2_g1 V2_g2 
# 1: A 10 40  6  3 
# 2: B 20 30  1  7 

Grundsätzlich keine Notwendigkeit zu schmelzen und zu werfen, eher direkt zu werfen. Sie können es installieren, indem Sie these instructions folgen.

Verwandte Themen