2012-11-28 9 views
5

Mam problemy z układanie kolumn w data.frame w jednej kolumnie. Teraz moje dane wygląda mniej więcej tak:układanie kolumn w data.frame w jednej kolumnie w 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 

Próbuję przekształcić data.frame tak, że wygląda tak:

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 
.  .  . 
.  .  . 
.  .  . 

Zgaduję, że ten problem wymaga pomocą przekształcić pakiet, ale nie jestem do końca pewien, jak go użyć do układania wielu kolumn w jednej kolumnie. Czy ktoś może udzielić pomocy w tej sprawie?

+0

Pan spojrzał na pomoc dla 'melt' w' reshape' (lub więcej uptodate 'pakiet reshape2' – mnel

Odpowiedz

9

Tutaj się stopić z przekształcenia:

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

i korzystania reshape2 (up-to-date, szybsza wersja reshape) składnia jest niemal identyczny.

Pliki pomocy mają użyteczne przykłady (patrz ?melt i link do melt.data.frame).

W twoim przypadku, coś jak poniżej będzie działać (zakładając swoją data.frame nazywa DF)

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

Pokrewne. Pytanie: czy istnieje sposób na wykorzystanie melt.data.frame stos wszystkie kolumny a data.frame? Czy ustawienie id.vars = c() działa? – gvrocha

+0

@gvrocha Rzeczywiście tak, należy zwrócić uwagę, że dostarczanie 'c()' różni się od nie dostarczania opcji.Zobacz "Szczegóły" w sekcji "? stopu" –

5

Skoro wspomniałeś „układanie” w tytule, można także spojrzeć na funkcję w stack baza 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 

Jeśli wartości w „czarny”, „biały” i „red” kolumny są factor s, trzeba je konwertować do character wartości.

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

Musiałem ułożyć wszystkie kolumny w ramce danych z 2 kolosami, a Twoje rozwiązanie działa. – phusion

Powiązane problemy