2012-11-28 18 views
5

Ich habe Probleme beim Stapeln von Spalten in einem dat.frame in einer Spalte. Jetzt sieht meine Daten etwas wie folgt aus:Stapeln von Spalten in data.frame in eine Spalte in R

id time black white red 
a  1  b1  w1  r1 
a  2  b2  w2  r2 
a  3  b3  w3  r3 
b  1  b4  w4  r4 
b  2  b5  w5  r5 
b  3  b6  w6  r6 

Ich versuche, die data.frame zu transformieren, so dass es wie folgt aussieht:

id time colour 
a  1  b1 
a  2  b2 
a  3  b3 
b  1  b4 
b  2  b5 
b  3  b6 
a  1  w1 
a  2  w2 
a  3  w3 
b  1  w4 
b  2  w5 
b  3  w6 
a  1  r1 
a  2  r2 
.  .  . 
.  .  . 
.  .  . 

Ich vermute, dass dieses Problem die Verwendung erfordert Umformpaket, aber ich bin mir nicht sicher, wie man es benutzt, um mehrere Spalten unter einer Spalte zu stapeln. Kann mir jemand dabei helfen?

+0

Haben Sie sich Hilfe für 'melt' im' reshape' (oder mehr uptodate 'reshape2' Paket – mnel

Antwort

9

Ist hier aus reshape schmelzen:

library(reshape) 
melt(x, id.vars=c('id', 'time'),var='color') 

Und mit reshape2 (ein up-to-date, schnellere Version reshape) die Syntax ist nahezu identisch.

Die Hilfedateien haben nützliche Beispiele (siehe ?melt und den Link zu melt.data.frame).

In Ihrem Fall so etwas wie die folgenden funktionieren wird (vorausgesetzt, Ihr data.frame wird DF genannt)

library(reshape2) 
melt(DF, id.var = c('id','time'), variable.name = 'colour') 
+0

Verwandte Frage:. Gibt es eine Möglichkeit melt.data.frame zu verwenden, um alle Spalten zu stapeln Ein data.frame? Funktioniert die Einstellung id.vars = c()? – gvrocha

+0

@ gvrocha Tatsächlich tut es das. Beachten Sie, dass die Angabe von 'c()' sich von der Option nicht unterscheidet.Siehe den Abschnitt "Details" von "? melt" –

5

Da Sie „Stapeln“ im Titel erwähnt, können Sie auch auf der stack Funktion sucht in Basis R:

cbind(mydf[1:2], stack(mydf[3:5])) 
# id time values ind 
# 1 a 1  b1 black 
# 2 a 2  b2 black 
# 3 a 3  b3 black 
# 4 b 1  b4 black 
# 5 b 2  b5 black 
# 6 b 3  b6 black 
# 7 a 1  w1 white 
# 8 a 2  w2 white 
# 9 a 3  w3 white 
# 10 b 1  w4 white 
# 11 b 2  w5 white 
# 12 b 3  w6 white 
# 13 a 1  r1 red 
# 14 a 2  r2 red 
# 15 a 3  r3 red 
# 16 b 1  r4 red 
# 17 b 2  r5 red 
# 18 b 3  r6 red 

Wenn die Werte in der "black", "white" und "rot" Spalten sind factor s, müssen Sie sie zuerst character Werte konvertieren.

cbind(mydf[1:2], stack(lapply(mydf[3:5], as.character))) 
+0

Ich musste alle Spalten in einen 2-Spalten-Datenrahmen stapeln und Ihre Lösung funktioniert. – phusion

Verwandte Themen