2011-06-24 10 views
5

में इधर-उधर एक चर पंक्ति मान स्तंभ बनाने के लिए एक मेज पिवट करने के लिए मैं कॉलम के साथ एक data.frame है: महीना, स्टोर और मांग।कैसे आर

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

मैं हर महीने, स्टोर उदा .:

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

किसी भी मदद की बहुत सराहना की है के लिए कॉलम के साथ एक नया data.frame या सरणी बनाने के लिए चारों ओर यह पिवट करने के लिए की जरूरत है। मैं सिर्फ सभी संभावना में

उत्तर

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) 

तो आर के साथ शुरू कर दिया है अपने महीना स्तंभ वर्णानुक्रम में क्रमित के स्तर के साथ एक कारक है (संपादित करें :)

> 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 

एक थोड़ा कम स्पष्ट विधि (के बाद से 'मैं 'समारोह अपने तर्क देता है):

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

कुछ अपने जवाब में मुद्रित उत्पादन के साथ बिल्कुल ठीक नहीं है। जनवरी ए उदाहरण के लिए 100 नहीं 150 होना चाहिए। आपका कोड काम करता है इसलिए मुझे संदेह है कि आपने स्तर को बदलने से पहले आउटपुट की प्रतिलिपि बनाई है। –

+0

आप त्रुटि के बारे में सही हैं लेकिन ऐसा इसलिए है क्योंकि मैंने स्तरों को अनुचित रूप से बदल दिया है। ऊपर देखो। –

5

में आपका स्वागत है आर

को

आर का उपयोग करके एक ही अंत तक पहुंचने के कई तरीके होते हैं। एक अन्य दृष्टिकोण हैडली के रिशेप पैकेज का उपयोग करना होगा।

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

और संदर्भ के लिए, आपको यह महान ट्यूटोरियल देखना चाहिए।

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

जो डेटा की झलकी के लिए देता है: http://www.jstatsoft.org/v21/i12/paper

+1

उन स्तरों के पुन: क्रम के बिना जो ओपी को वह नहीं देंगे जो उसने मांगा था। –

3

डेटा dat में हैं (और स्तरों के क्रम कैलेंडर के लिए सेट), फिर एक और आधार आर समाधान (अविश्वसनीय रूप से unintuitive) का उपयोग करने reshape() समारोह है :

> 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 

नाम आसानी से अगर आप चाहते हैं साफ किया जा सकता:

> 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 

(ऊपर उत्पादन प्राप्त करने के लिए, मैं में डेटा @ DWin के जवाब में पता चला है कि करने के लिए इसी तरह से पढ़ा है, और उसके बाद निम्न भाग गया:

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

जहां dat मैं डेटा क्या कहा जाता था)

+0

+1 बस reshape फ़ंक्शन का उपयोग करके मेरी निराशा की पुष्टि करने के लिए +1। –