2011-06-24 48 views
5

Tôi có data.frame với các cột: Tháng, Lưu trữ và Nhu cầu.Cách xoay bảng để làm cho các cột có giá trị hàng biến đổi trong R

Month Store Demand 
Jan  A 100 
Feb  A 150 
Mar  A 120 
Jan  B 200 
Feb  B 230 
Mar  B 320 

tôi cần phải xoay nó xung quanh để tạo ra một data.frame mới hoặc mảng với các cột cho mỗi tháng, cửa hàng ví dụ .:

Store Jan Feb Mar 
A  100 150 120 
B  200 230 320 

Bất kỳ sự giúp đỡ rất nhiều đánh giá cao. Tôi vừa bắt đầu với R.

Trả lời

9
> df <- read.table(textConnection("Month Store Demand 
+ Jan  A 100 
+ Feb  A 150 
+ Mar  A 120 
+ Jan  B 200 
+ Feb  B 230 
+ Mar  B 320"), header=TRUE) 

Vì vậy, trong tất cả các khả năng cột Tháng của bạn là một yếu tố có mức độ được sắp xếp theo thứ tự abc (EDIT :)

> df$Month <- factor(df$Month, levels= month.abb[1:3]) 
# Just changing levels was not correct way to handle the problem. 
# Need to use within a factor(...) call. 
> xtabs(Demand ~ Store+Month, df) 
     Month 
Store Jan Feb Mar 
    A 100 150 120 
    B 200 230 320 

Một phương pháp hơi ít rõ ràng (kể từ khi 'tôi 'hàm trả về đối số của nó):

> with(df, tapply(Demand, list(Store, Month) , I) ) 
    Jan Feb Mar 
A 100 150 120 
B 200 230 320 
+0

Điều gì đó không hoàn toàn đúng với kết quả được in trong câu trả lời của bạn. Tháng Giêng A phải là 100 không 150 ví dụ. Mã của bạn hoạt động vì vậy tôi nghi ngờ bạn đã sao chép đầu ra từ trước khi bạn thay đổi các cấp. –

+0

Bạn đúng về lỗi nhưng vì tôi đã thay đổi không đúng mức. Xem ở trên. –

5

Chào mừng bạn đến R.

Thường có nhiều cách để có được cùng một kết thúc bằng cách sử dụng R. Một cách tiếp cận khác sẽ là sử dụng gói định hình lại của Hadley.

# create the data as explained by @Dwin 
df <- read.table(textConnection("Month Store Demand 
           Jan  A 100 
           Feb  A 150 
           Mar  A 120 
           Jan  B 200 
           Feb  B 230 
           Mar  B 320"), 
       header=TRUE) 

# load the reshape package from Hadley -- he has created GREAT packages 
library(reshape) 

# reshape the data from long to wide 
cast(df, Store ~ Month) 

Và để tham khảo, bạn nên xem hướng dẫn tuyệt vời này. http://www.jstatsoft.org/v21/i12/paper

+1

Nếu không đặt lại các cấp độ sẽ không cung cấp cho OP những gì anh ta yêu cầu. –

3

Nếu dữ liệu là trong dat (và mức thiết lập lịch theo thứ tự), sau đó một giải pháp cơ sở R là sử dụng (vô cùng unintuitive) reshape() chức năng:

reshape(dat, v.names = "Demand", idvar = "Store", timevar = "Month", 
     direction = "wide") 

mà cho đoạn dữ liệu cho :

> reshape(dat, v.names = "Demand", idvar = "Store", timevar = "Month", 
+   direction = "wide") 
    Store Demand.Jan Demand.Feb Demand.Mar 
1  A  100  150  120 
4  B  200  230  320 

tên có thể dễ dàng được làm sạch nếu bạn muốn:

> out <- reshape(dat, v.names = "Demand", idvar = "Store", timevar = "Month", 
+    direction = "wide") 
> names(out)[-1] <- month.abb[1:3] 
> out 
    Store Jan Feb Mar 
1  A 100 150 120 
4  B 200 230 320 

(Để có được kết quả trên, tôi đọc dữ liệu ở trong một thời trang tương tự như những gì thể hiện trong @ trả lời DWin, và sau đó chạy như sau:

dat <- transform(dat, Month = factor(Month, levels = month.abb[1:3])) 

nơi dat là những gì tôi gọi là dữ liệu)

+0

+1 chỉ để tái khẳng định sự thất vọng của tôi khi sử dụng chức năng định hình lại. –

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