2012-11-28 20 views
5

Bir data.frame sütunlarını bir sütuna istiflerken sorun yaşıyorum.data.frame içindeki sütunları bir sütun içine yığmak 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 

Ben şuna benzer şekilde data.frame dönüştürmeye çalışıyorum:

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

Bu sorun kullanarak gerektirdiğini tahmin ediyorum Şimdi verilerim şuna benzer paketi yeniden şekillendirin, ancak bir sütunun altında birden çok sütun yığmak için nasıl kullanılacağını tam olarak emin değilim. Bu konuda yardımcı olabilecek kimse var mı?

+0

Eğer 'reshape' içinde melt'' için yardım baktı (veya daha fazla çağcıl 'reshape2' paket mü – mnel

cevap

9

İşte reshape gelen eritmek oluyor:

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

Ve reshape2 kullanarak (reshape bir up-to-date, daha hızlı versiyonu) sözdizimi neredeyse aynıdır.

Yardım dosyalarının kullanışlı örnekleri vardır (bkz. ?melt ve melt.data.frame numaralı bağlantı). Eğer başlığında "istifleme" söz beri durumda

, aşağıdaki gibi bir şey çalışacaktır ayrıca stack işlevinde bakabilirsiniz,

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

İlgili soru:. Tüm sütunları yığın melt.data.frame kullanmak için bir yol yoktur id.vars = c() ayarlanıyor mu? – gvrocha

+0

@gvrocha Gerçekten de "c()' yi tedarik etmenin seçeneğin verilmemesinden farklı olduğunu unutmayın. "Melt" nin "Ayrıntılar" bölümüne bakın. –

5

(varsayarsak data.frame DF denir) baz 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 

Eğer değerler, "siyah", "beyaz" ve "kırmızı" sütunları ilk character değerlere dönüştürmek gerekir, factor ler vardır.

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

Tüm sütunları 2-col veri çerçevesine yerleştirmem gerekiyordu ve çözümünüz çalışıyor. – phusion

İlgili konular