2013-04-27 13 views
5

में कनवर्ट करना मेरे पास कॉलम और वर्षों में पंक्तियों के महीनों के साथ 100 वर्ष (1200 डेटा पॉइंट) के लिए मासिक डेटा का डेटा फ्रेम है। मैं इसे मासिक समय श्रृंखला में परिवर्तित करना चाहता हूं और मैंने कई तरीकों से प्रयास किया है, जिनमें से कोई भी सही "अस्थायी" संरचना नहीं बना रहा है।डेटा फ्रेम को मासिक समय श्रृंखला

समस्या डेटा फ्रेम को 12 चर (महीनों) के 100 अवलोकन (वर्षों) के रूप में देखते हुए आर के साथ निहित है। यहाँ मेरी नवीनतम कोशिश के लिए एक प्रतिलिपि प्रस्तुत करने योग्य कोड है:

set.seed(12) 
dummy.df <- as.data.frame(matrix(round(rnorm(1200),digits=2),nrow=100,ncol=12)) 
rownames(dummy.df) <- seq(from=1901, to=2000) 
colnames(dummy.df) <- c("jan","feb","mar","apr","may","jun","jul","aug","sep","oct","nov","dec") 
dummy.df.ts <- ts(as.vector(as.matrix(dummy.df)), start=c(1901,1), end=c(2000,12), frequency=12) 

"dummy.df.ts" में वस्तु, पंक्तियों और स्तंभों स्तंभों में अनुक्रमिक टिप्पणियों के बंद और बदले हैं, सभी Januarys februarys आदि साथ खड़ी दिखती हैं एक के बाद एक। मैं सही अस्थायी संरचना कैसे प्राप्त कर सकता हूं?

fr.monthly.temp.sample.ts <- ts(as.vector(as.matrix(fr.monthly.temp.sample)),        start=c(1901,1), end=c(1905,12), frequency=12) 

यह वह जगह है: -:

अपने डेटा का एक उदाहरण 1905

fr.monthly.temp.sample 

    JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC 
1901 2.7 0.4 4.7 10.0 13.0 16.9 19.2 18.3 15.7 10.6 4.9 3.5 
1902 4.1 3.2 7.5 10.3 10.0 15.1 18.2 17.4 15.0 10.2 6.3 3.5 
1903 3.8 5.9 7.6 7.1 12.9 14.9 17.6 17.3 15.5 12.1 6.9 2.7 
1904 3.0 4.6 5.5 10.3 13.6 16.3 20.2 18.5 13.9 11.2 5.4 4.8 
1905 1.7 4.0 7.4 9.3 11.9 16.5 20.0 17.6 14.7 8.4 5.5 3.8 

Plot of original time series

और यह TS() कॉल का उपयोग करके इन 1901 से मासिक तापमान मान हैं आउटपुट मुझे टाइम सीरीज ऑब्जेक्ट के लिए मिलता है:

fr.monthly.temp.sample.ts 

     Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec 
1901 2.7 4.1 3.8 3.0 1.7 0.4 3.2 5.9 4.6 4.0 4.7 7.5 
1902 7.6 5.5 7.4 10.0 10.3 7.1 10.3 9.3 13.0 10.0 12.9 13.6 
1903 11.9 16.9 15.1 14.9 16.3 16.5 19.2 18.2 17.6 20.2 20.0 18.3 
1904 17.4 17.3 18.5 17.6 15.7 15.0 15.5 13.9 14.7 10.6 10.2 12.1 
1905 11.2 8.4 4.9 6.3 6.9 5.4 5.5 3.5 3.5 2.7 4.8 3.8 

Plot of time series from R code

बदली हुई अस्थायी संरचना --Note (कॉलम के मानों पंक्तियों में अब कर रहे हैं ..) -

धन्यवाद।

+0

मैंने अपना जवाब संपादित कर लिया है। मुझे वास्तव में 'प्लॉट' द्वारा प्रदर्शित डेटा में कोल्स और पंक्तियों के बीच" स्विचिंग "का अनुभव नहीं होता है।शायद आप अपने डेटा के नमूने का उपयोग करके कुछ ही वर्षों में बेहतर जवाब प्राप्त कर सकते हैं और आपको प्राप्त चार्ट पोस्ट कर सकते हैं। – Michele

+0

मैंने मूल्यों के गलत क्रम को दिखाने के लिए अपना मूल डेटा और प्लॉट जोड़ा है। आपका ईडीआईटी 1 समाधान मुझे एक बहुविकल्पीय समय श्रृंखला देता है जो मैं नहीं चाहता हूं, मैं इसे आगे संसाधित करने के लिए एक univariate श्रृंखला के रूप में रखना चाहता हूं .. EDIT 2 के लिए, मैंने उसी कारण के लिए .vector() की कोशिश की, लेकिन वह वह ऑपरेशन है जो ऑर्डरिंग समस्या का कारण बन रहा है। शायद @Alexander द्वारा पोस्ट किया गया समाधान # 1 काम करेगा, मुझे अभी भी कोशिश करनी है .. – avg

+0

मेरा संपादन 1 समाधान नहीं था ... यह केवल टी() काम करता है इसके बारे में जागरूक था। मेरा संपादन 2 एक वेक्टर में डेटा के साथ शुरू हुआ ... मुझे एहसास नहीं हुआ कि आपको बस एक ट्रांसपोज़ की जरूरत है ... 'दौर (सीईसी (5,10, लंबाई .out = 24), 1)' एक वेक्टर है । – Michele

उत्तर

3

समाधान 1

आप स्थानांतरित कर सकता है (समारोह टी()) यह vectorizing से पहले मैट्रिक्स:

set.seed(12) 
dummy.df <- as.data.frame(matrix(round(rnorm(1200), digits = 2), 
           nrow = 100, ncol = 12)) 
rownames(dummy.df) <- seq(1901, 2000) 
colnames(dummy.df) <- month.abb 
dummy.df.ts <- ts(as.vector(t(as.matrix(dummy.df))), 
        start=c(1901,1), end=c(2000,12), frequency=12) 

समाधान 2

आप डेटा melt सकता है, तिथि के अनुसार आदेश, फिर ts() फ़ंक्शन लागू करें।

यहां डेटा सेटअप है। यदि आपकी भाषा सेटिंग अंग्रेजी है तो आप month.abb का उपयोग करके कुछ कोड बचा सकते हैं, लेकिन यह अन्य भाषा लोकेशंस के लिए मजबूत नहीं है।

set.seed(12) 
dummy.df <- as.data.frame(matrix(round(rnorm(1200),digits=2),nrow=100,ncol=12)) 
months <- format(seq.Date(as.Date("2013-01-01"), as.Date("2013-12-01"), 
          by = "month"), format = "%b") 
colnames(dummy.df) <- months 
dummy.df$Year <- seq(1901, 2000) # set as variable, not as rownames 

डेटा पिघल तो आप 1200 पंक्तियाँ, प्रत्येक एक अवलोकन का प्रतिनिधित्व करने के साथ एक डेटा फ्रेम है:

library("reshape2") 
dummy.df <- melt(dummy.df, id.vars = "Year") 

आदेश दिनांक द्वारा टिप्पणियों:

dummy.df$Date <- as.Date(paste(dummy.df$Year, dummy.df$variable, "01", sep = "-"), 
         format = ("%Y-%b-%d")) 
dummy.df <- dummy.df[order(dummy.df$Date), ] 

तो फिर तुम आवेदन कर सकते हैं एक समान टीएस() कॉल, टी ऑब्जेक्ट वांछित क्रम दिखाते हुए:

dummy.df.ts <- ts(dummy.df$value, start=c(1901,1), end=c(2000,12), frequency=12) 
+0

उत्तर के लिए धन्यवाद। मैंने # 1 पोस्ट करने से पहले # 2 की कोशिश की और मुझे सही समय श्रृंखला आउटपुट दिया। लेकिन मैं जानना चाहता था कि रीशेप का उपयोग किये बिना इसे कैसे करना है क्योंकि जो भी कर रहा था वह अनिवार्य रूप से कॉलम वेक्टर के रूप में मूल्यों को ऑर्डर कर रहा था यानी मैं अपने मूल डीएफ एंड-टू-एंड से पंक्तियों को ढेर कर रहा था। मैंने परिणाम के बिना पहले कुछ टी() ऑपरेशन की कोशिश की लेकिन मुझे नहीं लगता कि मैंने आपके द्वारा पोस्ट किए गए एक की कोशिश की है। 1. आपको बताएगा .. – avg

+0

समाधान 1 वही करता है जो मैं चाहता हूं..धन्यवाद! – avg

संबंधित मुद्दे