2012-03-26 19 views
6

में प्रति घंटा समय श्रृंखला डेटा पुनर्गठन मैं प्रति घंटा डेटा के एक वर्ष के महत्वपूर्ण एक डेटा फ्रेम में आर में है:एकीकृत करने वाला आर

> str(df.MHwind_load) # compactly displays structure of data frame 
'data.frame': 8760 obs. of 6 variables: 
$ Date   : Factor w/ 365 levels "2010-04-01","2010-04-02",..: 1 1 1 1 1 1 1 1 1 1 ... 
$ Time..HRs. : int 1 2 3 4 5 6 7 8 9 10 ... 
$ Hour.of.Year : int 1 2 3 4 5 6 7 8 9 10 ... 
$ Wind.MW  : int 375 492 483 476 486 512 421 396 456 453 ... 
$ MSEDCL.Demand: int 13293 13140 12806 12891 13113 13802 14186 14104 14117 14462 ... 
$ Net.Load  : int 12918 12648 12323 12415 12627 13290 13765 13708 13661 14009 ... 

प्रति घंटा की संरचना के संरक्षण करते हुए मैं चाहते हैं पता है कि कैसे को निकालने के लिए

  1. एक विशेष महीने/महीनों के समूह
  2. प्रत्येक महीने के पहले दिन/पहले सप्ताह आदि
  3. सभी सोमवार, सभी मंगलवार आदि साल
  4. की

मैंने परिणाम के बिना "कट" का उपयोग करने की कोशिश की है और ऑनलाइन देखने के बाद सोचते हैं कि "लुब्रिडेट" ऐसा करने में सक्षम हो सकता है लेकिन उपयुक्त उदाहरण नहीं मिला है। मैं इस मुद्दे पर मदद की बहुत सराहना करता हूं।

संपादित करें: डेटा फ्रेम में डेटा का एक नमूना नीचे है:

Date Hour.of.Year Wind.MW datetime 
1 2010-04-01 1 375 2010-04-01 00:00:00 
2 2010-04-01 2 492 2010-04-01 01:00:00 
3 2010-04-01 3 483 2010-04-01 02:00:00 
4 2010-04-01 4 476 2010-04-01 03:00:00 
5 2010-04-01 5 486 2010-04-01 04:00:00 
6 2010-04-01 6 512 2010-04-01 05:00:00 
7 2010-04-01 7 421 2010-04-01 06:00:00 
8 2010-04-01 8 396 2010-04-01 07:00:00 
9 2010-04-01 9 456 2010-04-01 08:00:00 
10 2010-04-01 10 453 2010-04-01 09:00:00 
.. .. ... .......... ........ 
8758 2011-03-31 8758 302 2011-03-31 21:00:00 
8759 2011-03-31 8759 378 2011-03-31 22:00:00 
8760 2011-03-31 8760 356 2011-03-31 23:00:00 

संपादित करें: अतिरिक्त समय आधारित संचालन मैं एक ही डाटासेट पर प्रदर्शन करने के लिए चाहते हैं 1. प्रदर्शन घंटे-दर-घंटे औसतन सभी डेटा बिंदुओं के लिए वर्ष में प्रत्येक दिन के पहले घंटे में सभी मूल्यों का औसत। आउटपुट पूरे वर्ष (24 बार अंक) 2. प्रत्येक सप्ताह और प्रत्येक महीने यानी 52 और 12 घंटे की प्रोफाइल क्रमश: प्राप्त करें 3. मौसमी औसत, उदाहरण के लिए जून के लिए सितंबर

+0

यह पूरी तरह से आर प्रोग्रामिंग संबंधित प्रश्न है, जिसमें कोई सांख्यिकीय सामग्री नहीं है। हम ऐसे प्रश्न स्टैक ओवरफ्लो में माइग्रेट करते हैं, क्योंकि यहां हमारे पास अधिक प्रोग्रामर हैं। – mpiktas

+0

मैं आपके डेटा की कई पंक्तियों को जोड़ने का सुझाव देता हूं। यहां डंप के साथ फ्रेम करें। मुझे लगता है कि केवल तारीख कॉलम पर्याप्त होगा। – mpiktas

+0

@mpiktas: मैंने अपने डेटा फ्रेम से एक नमूना जोड़ा है। ध्यान दें कि मैंने _timeSequence_ – avg

उत्तर

6

तारीख को उस प्रारूप में कनवर्ट करें जो ल्यूब्रिडेट समझता है और फिर month, mday, wday फ़ंक्शन का उपयोग करें।

मान लीजिए आप समय स्तंभ Date में संग्रहीत के साथ एक data.frame है, तो आपके प्रश्नों के लिए इस सवाल का जवाब होगा:

###dummy data.frame 
df <- data.frame(Date=c("2012-01-01","2012-02-15","2012-03-01","2012-04-01"),a=1:4) 
##1. Select rows for particular month 
subset(df,month(Date)==1) 

##2a. Select the first day of each month 
subset(df,mday(Date)==1) 

##2b. Select the first week of each month 
##get the week numbers which have the first day of the month 
wkd <- subset(week(df$Date),mday(df$Date)==1) 
##select the weeks with particular numbers 
subset(df,week(Date) %in% wkd)  

##3. Select all mondays 
subset(df,wday(Date)==1) 
+0

का उपयोग करके डेटाटाइम बनाया है, उपर्युक्त सभी # 2b को छोड़कर काम करते हैं। मुझे संदेह है कि मेरे डेटा के साथ ऐसा कुछ हो सकता है, यह 1 अप्रैल 2010 से शुरू होता है और 31 मार्च 2011 तक - 2 कैलेंडर वर्ष तक चलता है। – avg

+0

मैं आदेश चलाता हूं: wkd <- subset (सप्ताह (newdf $ डेटाटाइम), mday (newdf $ डेटाटाइम) == 1) all.firstweeks।newdf <- सबसेट (newdf, सप्ताह (डेटाटाइम)%% wkd में% "डेटाटाइम" यहां है: डेटाटाइम <- timeSequence (= "2010-04-01 00:00" से = = 2011-03- 31 23:00 ", द्वारा =" घंटा ") यहां आउटपुट का एक स्निपेट है: – avg

+0

आउटपुट: 'all.firstweeks.newdf [1: 240,]' दिनांक समय .. एचआरएस। घंटा .of.Year Wind.MW MSEDCL.Demand 1 2010-04-01 1 1 375 13293 2 2010-04-01 2 2 492 13140 3 2010-04-01 3 3 483 12806 । ... .. । ... .. । ... ... 168 2010-04-07 24 168 77 14447 673 2010-04-29 1 673 3 9 7 13468 674 2010-04-29 2 674 495 13426 – avg

6
  1. एक Date प्रतिनिधित्व करने के लिए सबसे पहले स्विच: as.Date(df.MHwind_load$Date)
  2. फिर फोन weekdays सप्ताह के दिन के साथ लेबल किए गए एक नए कारक को
  3. फिर दिनांक वेक्टर पर months पर कॉल करें ताकि नाम के साथ लेबल वाला नया कारक प्राप्त हो सके। महीने
  4. वैकल्पिक रूप से years चर (नीचे देखें) बनाएं।

अब subset इनके प्रासंगिक संयोजन का उपयोग कर डेटा फ्रेम। चरण 2. आपके कार्य का उत्तर प्राप्त होता है 3. चरण 3. और 4. आपको कार्य में ले जाते हैं 1. कार्य 2 को आर या दो पंक्तियों की आवश्यकता हो सकती है या बस एक महीने में सभी सोमवार से संबंधित पंक्तियों का चयन करें और परिणाम पर unique, या इसके बदलते-अहं duplicated पर कॉल करें।

जब से तुम समय (प्रति घंटा) अपने डेटा के भाग के बारे में नहीं कह रहे हैं आप के लिए जा रहा प्राप्त करने के लिए ...

newdf <- df.MHwind_load ## build an augmented data set 
newdf$d <- as.Date(newdf$Date) 
newdf$month <- months(newdf$d) 
newdf$day <- weekdays(newdf$d) 

## for some reason R has no years function. Here's one 
years <- function(x){ format(as.Date(x), format = "%Y") } 

newdf$year <- years(newdf$d) 

# get observations from January to March of every year 
subset(newdf, month %*% in c('January', 'February', 'March')) 

# get all Monday observations 
subset(newdf, day == 'Monday') 

# get all Mondays in 1999 
subset(newdf, day == 'Monday' & year == '1999') 

# slightly fancier: _first_ Monday of each month 
# get the first weeks 
first.week.of.month <- !duplicated(cbind(newdf$month, newdf$day)) 
# now pull out the mondays 
subset(newdf, first.monday.of.month & day=='Monday') 
+0

लीड के लिए धन्यवाद। मैं इन कार्यों का उपयोग करने में सक्षम था लेकिन मेरे डेटा को पार्स करने के लिए कोड बनाने पर अटक गया था। मैं @ ब्रायन गुड्रिच के समाधान की कोशिश कर रहा हूं .. – avg

+0

असल में अब मैंने यह लिखा है, मुझे लगता है कि मुझे अन्य उत्तरों में थोड़ा सा 'लुब्रिडेट' चीज़ पसंद है। यहां 'सबसेट' कमांड के लिए एक परिचय के रूप में कोड के बारे में सोचें :-) – conjugateprior

3

, यह सबसे अच्छा है तो एक तिथि वस्तु के रूप में अपना डेटा संग्रहीत करने। अन्यथा, आपको chron में रुचि हो सकती है, जिसमें कुछ सुविधाजनक कार्य भी हैं जैसे आप नीचे देखेंगे।

कॉन्जुगेट के उत्तर के संबंध में, आपको अपने दिनांक डेटा को डेट ऑब्जेक्ट के रूप में स्टोर करना चाहिए। चूंकि आपका डेटा पहले से ही डिफ़ॉल्ट प्रारूप ('yyyy-mm-dd') का पालन करता है, इसलिए आप बस उस पर डेट कर सकते हैं। अन्यथा, आपको अपना स्ट्रिंग प्रारूप निर्दिष्ट करना होगा। मैं यह सुनिश्चित करने के लिए आपके कारक के रूप में .character का भी उपयोग करूंगा कि आपको त्रुटियों में इनलाइन नहीं मिलती है। मुझे पता है कि मैंने कारणों से कारकों में इन समस्याओं के साथ समस्याओं में भाग लिया है (संभावित रूप से वर्तमान संस्करण में सही)।

df.MHwind_load <- transform(df.MHwind_load, Date = as.Date(as.character(Date))) 

अब आप इच्छित जानकारी को निकालने वाले रैपर फ़ंक्शंस बनाने के लिए अच्छा प्रदर्शन करेंगे। आप को बदल सकते हैं जैसे मैंने महीनों, दिन, वर्षों इत्यादि का प्रतिनिधित्व करने वाले उन स्तंभों को बस जोड़ने के लिए उपरोक्त किया था, और फिर उन पर तर्कसंगत रूप से सबसेट किया था। वैकल्पिक रूप से, आप कुछ इस तरह कर सकते हैं:

getMonth <- function(x, mo) { # This function assumes w/in single year vector 
    isMonth <- month(x) %in% mo # Boolean of matching months 
    return(x[which(isMonth)]  # Return vector of matching months 
} # end function 

या, संक्षिप्त रूप में

getMonth <- function(x, mo) x[month(x) %in% mo] 

यह है कि जानकारी (बदलना फ्रेम) भंडारण या (प्रयोग एक्सेसर जब इच्छित इसे संसाधित होने के बीच सिर्फ एक समंजन है विधि)।

एक और जटिल प्रक्रिया एक महीने के पहले दिन, कहने के लिए आपकी आवश्यकता है। हालांकि, यह पूरी तरह से मुश्किल नहीं है। नीचे एक ऐसा फ़ंक्शन है जो उन सभी मानों को वापस कर देगा, लेकिन किसी दिए गए महीने के लिए मूल्यों के क्रमबद्ध वेक्टर को बस सब्सक्राइब करना और अपना पहला लेना आसान है।

getFirstDay <- function(x, mo) { 
    isMonth <- months(x) %in% mo 
    x <- sort(x[isMonth]) # Look at only those in the desired month. 
         # Sort them by date. We only want the first day. 
    nFirsts <- rle(as.numeric(x))$len[1] # Returns length of 1st days 
    return(x[seq(nFirsts)]) 
} # end function 

आसान विकल्प,

getFirstDayOnly <- function(x, mo) {sort(x[months(x) %in% mo])[1]} 

मैं इन नमूने नहीं किया होगा के रूप में आप किसी भी डेटा के नमूने प्रदान नहीं किया है, लेकिन इस दृष्टिकोण की तरह मदद कर सकते हैं आप जानकारी प्राप्त है तुम्हारी कामना है। यह आपके लिए यह है कि इन्हें अपने काम के प्रवाह में कैसे रखा जाए। उदाहरण के लिए, कहें कि आप किसी दिए गए वर्ष के प्रत्येक महीने के लिए पहला दिन प्राप्त करना चाहते हैं (मान लीजिए कि हम केवल एक वर्ष देख रहे हैं; आप पहले से ही एक वर्ष में अपने वेक्टर को रैपर बना सकते हैं या प्री-प्रोसेस कर सकते हैं)।

# Return a vector of first days for each month 
df <- transform(df, date = as.Date(as.character(date))) 
sapply(unique(months(df$date)), # Iterate through months in Dates 
     function(month) {getFirstDayOnly(df$date, month)}) 

ऊपर भी अन्य एक्सेसर समारोह का उपयोग करता है एक अलग सुविधा समारोह के रूप में तैयार किया जा सकता है। इस तरह, आप अपनी इच्छित जानकारी के टुकड़े प्राप्त करने के लिए प्रत्यक्ष लेकिन संक्षिप्त विधियों की एक श्रृंखला बनाते हैं। फिर आप आसानी से उन कार्यों को समझने के लिए बहुत सरल और आसान बनाने के लिए उन्हें खींचते हैं जिन्हें आप अपनी स्क्रिप्ट में उपयोग कर सकते हैं ताकि आप सबसे कुशल तरीके से अपनी इच्छित चीज़ों को सटीक बना सकें।

आपको उपरोक्त उदाहरणों का उपयोग करने में सक्षम होना चाहिए ताकि यह पता लगाने के लिए कि आपको आवश्यक दिनांक जानकारी तक पहुंचने के लिए अन्य रैपरों को प्रोटोटाइप कैसे किया जाए। अगर आपको उन लोगों की मदद की ज़रूरत है, तो एक टिप्पणी में पूछने के लिए स्वतंत्र महसूस करें।

+0

विस्तृत उत्तर के लिए धन्यवाद, इससे मदद मिलती है क्योंकि मैं आर में बहुत कुशल नहीं हूं। मैंने निम्नलिखित परिणामों के साथ सुझाव दिया है: 'alt। allfirstdays.newdf <- sapply (अद्वितीय (महीना (डेटाटाइम)), फ़ंक्शन (महीना) {getFirstDay (डेटाटाइम, महीना)}) – avg

+0

Math.data.frame में त्रुटि (टुकड़े [, 1: 5]): गैर- डेटा फ्रेम में संख्यात्मक चर: महीना "डेटाटाइम" यहां है: 'डेटाटाइम <- timeSequence (= "2010-04-01 00:00" से = "2011-03-31 23:00", = "घंटा") ' यहां "महीने" क्या है, _lubridate_ या एक नया चर में फ़ंक्शन? मैंने उसी परिणाम के साथ _months (डेटाटाइम) _ करने का प्रयास किया – avg

+0

मेरा दृष्टिकोण डेट क्लास ऑब्जेक्ट्स के साथ काम करता है, लुब्र्रिडेट नहीं (पहले कभी इसका इस्तेमाल नहीं किया गया)। तिथि का उपयोग करने का बिंदु - जैसा कि कहते हैं, _chron _-- का मतलब है कि समय घटक कोई फर्क नहीं पड़ता। यदि आपका डेटा "2010-04-01" है तो as.Date ("2010-04-01") इसे सही तरीके से संग्रहीत करता है। यदि इसके बजाय आपके पास "01/04/2010" था तो आपको दिनांक (दिनांक 01/04/2010 ", प्रारूप ="% d /% m /% y ") करना होगा। विवरण के लिए सहायता पृष्ठ देखें। यदि आपके डेटा में समय शामिल है, तो आपको उस हिस्से को बाहर करना होगा। जबकि स्ट्रस्प्लिट काम कर सकता है, यह सब कुछ करने के लिए पर्याप्त है ("2010-04-01 00:00", 1, 10) और जैसा कि। –

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