2012-11-28 36 views
5

Tôi gặp sự cố khi xếp các cột trong một data.frame vào một cột. Bây giờ dữ liệu của tôi trông giống như sau:xếp chồng các cột trong data.frame vào một cột trong 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 

Tôi đang cố gắng để chuyển đổi data.frame để nó trông như thế này:

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

Tôi đoán rằng vấn đề này đòi hỏi phải sử dụng định dạng lại gói, nhưng tôi không chắc chắn làm thế nào để sử dụng nó để ngăn xếp nhiều cột dưới một cột. Bất cứ ai có thể cung cấp trợ giúp về điều này?

+0

Bạn đã nhìn sự giúp đỡ cho 'melt' trong' reshape' (hoặc uptodate hơn 'gói reshape2' – mnel

Trả lời

9

Dưới đây là tan chảy từ Reshape:

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

Và sử dụng reshape2 (một phiên bản up-to-date, nhanh hơn reshape) cú pháp là gần như giống hệt nhau.

Tệp trợ giúp có các ví dụ hữu ích (xem ?melt và liên kết đến melt.data.frame).

Trong trường hợp của bạn, giống như sau sẽ làm việc (giả sử data.frame của bạn được gọi DF)

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

câu hỏi liên quan:. Là có một cách để sử dụng melt.data.frame để ngăn xếp tất cả các cột của có phải id.vars = c() hoạt động không? – gvrocha

+0

@gvrocha Thật vậy, lưu ý rằng việc cung cấp 'c()' khác với việc không cung cấp tùy chọn. Xem phần "Chi tiết" của '? melt' –

5

Kể từ khi bạn đề cập đến "xếp chồng" trong tiêu đề của bạn, bạn cũng có thể ghé qua stack chức năng trong cơ sở 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 

Nếu các giá trị trong "đen", "trắng" và cột "đỏ" là factor s, bạn sẽ cần phải chuyển đổi chúng sang character giá trị đầu tiên.

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

Tôi cần phải xếp tất cả các cột vào một dataframe 2-col và giải pháp của bạn hoạt động. – phusion

Các vấn đề liên quan