2012-11-28 15 views
5

Ho problemi a impilare colonne in un data.frame in una colonna. Ora il mio dati simile a questa:colonne impilate in data.frame in una colonna 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 

Sto cercando di trasformare la data.frame in modo che assomiglia a questo:

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

Sto indovinando che questo problema richiede l'utilizzo del rimodella il pacchetto, ma non sono esattamente sicuro di come utilizzarlo per impilare più colonne sotto una colonna. Qualcuno può fornire aiuto su questo?

+0

hai guardato l'aiuto per 'melt' nel' reshape' (o più uptodate 'pacchetto reshape2' – mnel

risposta

9

Ecco sciogliersi da Reshape:

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

E usando reshape2 (una versione up-to-date, più veloce del reshape) la sintassi è quasi identico.

I file della guida hanno esempi utili (vedere ?melt e il collegamento a melt.data.frame).

Nel tuo caso, qualcosa di simile a quanto segue funzionerà (supponendo che il data.frame si chiama DF)

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

questione connessa:. C'è un modo per utilizzare melt.data.frame di impilare tutte le colonne di un data.frame? L'impostazione id.vars = c() funziona? – gvrocha

+0

@gvrocha Effettivamente. Nota che fornire 'c()' è diverso dal non fornire l'opzione.Vedi la sezione "Dettagli" di '? melt' –

5

Dal momento che si parla di "stacking" nel titolo, si può anche guardare alla funzione stack in Base 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 

Se i valori del "nero", "bianco", e le colonne "rosse" sono factor s, è necessario convertirli in valori character prima.

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

Avevo bisogno di impilare tutte le colonne in un dataframe a 2 colori e la soluzione funziona. Grazie. – phusion

Problemi correlati