2011-06-24 7 views

Odpowiedz

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) 

Więc najprawdopodobniej kolumnie Miesiąc jest czynnikiem z poziomami sortowane alfabetycznie (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 

Nieco mniej oczywisty sposób (od „I "funkcja zwraca swój argument):

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

Coś nie zgadza się z wydrukowanymi odpowiedziami. Jan A powinien mieć na przykład 100, a nie 150. Twój kod działa, więc podejrzewam, że skopiowałeś dane wyjściowe przed zmianą poziomów. –

+0

Masz rację co do błędu, ale dlatego, że niewłaściwie zmieniłem poziomy. Patrz wyżej. –

5

Witamy R.

Zwykle istnieje wiele sposobów na osiągnięcie tego samego celu za pomocą R. Innym podejściem byłoby użycie pakietu przekształcenia Hadleya.

# 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) 

W celach poglądowych powinieneś sprawdzić ten świetny samouczek. http://www.jstatsoft.org/v21/i12/paper

+1

Bez zmiany kolejności poziomów, które nie dadzą OP, o co prosił. –

3

Jeżeli dane są dat (a poziom ustawiony okresie kolejności), a następnie inny roztwór zasady R jest użycie (bardzo unintuitive) reshape() funkcję:

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

który po fragmencie danych otrzymujemy :

> 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 

nazwy można łatwo czyścić, jeśli chcesz:

> 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 

(Aby uzyskać wyjście powyżej, czytam dane w sposób podobny do pokazanego na @ Dwin za odpowiedzi, a następnie prowadził następujące:

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

gdzie dat było to, co nazywa się dane)

+0

+1 tylko po to, aby potwierdzić moją frustrację z korzystania z funkcji przekształcania. –

Powiązane problemy