आर

2011-03-28 10 views
5

में कुल डेटा विलय करने के लिए दैनिक डेटा में प्रति घंटा डेटा एकत्र करने के बारे में मेरे previous question के बाद, मैं (ए) मासिक कुल और (बी) मासिक डेटा को मूल डेटाफ्रेम में विलय करना चाहता हूं।आर

Lines <- "Date,Outdoor,Indoor 
01/01/2000 01:00,30,25 
01/01/2000 02:00,31,26 
01/01/2000 03:00,33,24 
02/01/2000 01:00,29,25 
02/01/2000 02:00,27,26 
02/01/2000 03:00,39,24 
12/01/2000 02:00,27,26 
12/01/2000 03:00,39,24 
12/31/2000 23:00,28,25" 

दैनिक समुच्चय इस तरह मेरी previous question में जवाब दिया गया है, और फिर मैं अपने रास्ते वहाँ से मासिक समुच्चय का उत्पादन करने के पा सकते हैं, कुछ करने के लिए:

मेरी मूल dataframe इस तरह दिखता है

Lines <- "Date,Month,OutdoorAVE 
01/01/2000,Jan,31.33 
02/01/2000,Feb,31.67 
12/01/2000,Dec,31.33" 

जहां आउटडोअर दैनिक न्यूनतम और अधिकतम आउटडोर तापमान का मासिक औसत है।

Lines <- "Date,Outdoor,Indoor,Month,OutdoorAVE 
01/01/2000 01:00,30,25,Jan,31.33 
01/01/2000 02:00,31,26,Jan,31.33 
01/01/2000 03:00,33,24,Jan,31.33 
02/01/2000 01:00,29,25,Feb,31.67 
02/01/2000 02:00,27,26,Feb,31.67 
02/01/2000 03:00,39,24,Feb,31.67 
12/01/2000 02:00,27,26,Dec,31.33 
12/01/2000 03:00,39,24,Dec,31.33 
12/31/2000 23:00,28,25,Dec,31.33" 

मैं ऐसा करने के बारे में पर्याप्त अनुसंधान पता नहीं है: क्या मैं अंत में करना चाहते हैं कुछ इस तरह है। कोई भी मदद बहुत ही सराहनीय होगी।

उत्तर

2

ave और जैसे POSIXlt निकालने के लिए महीने का प्रयास करें:

zz <- textConnection(Lines) 
Data <- read.table(zz,header=T,sep=",",stringsAsFactors=F) 
close(zz) 

Data$Month <- strftime(
    as.POSIXlt(Data$Date,format="%m/%d/%Y %H:%M"), 
    format='%b') 
Data$outdoor_ave <- ave(Data$Outdoor,Data$Month,FUN=mean) 

देता है:

> Data 
       Date Outdoor Indoor Month outdoor_ave 
1 01/01/2000 01:00  30  25 Jan 31.33333 
2 01/01/2000 02:00  31  26 Jan 31.33333 
3 01/01/2000 03:00  33  24 Jan 31.33333 
4 02/01/2000 01:00  29  25 Feb 31.66667 
5 02/01/2000 02:00  27  26 Feb 31.66667 
6 02/01/2000 03:00  39  24 Feb 31.66667 
7 12/01/2000 02:00  27  26 Dec 31.33333 
8 12/01/2000 03:00  39  24 Dec 31.33333 
9 12/31/2000 23:00  28  25 Dec 31.33333 

संपादित करें: डाटा में तो बस calcualte माह के रूप में ऊपर दिखाए गए और मर्ज का उपयोग करें:

zz <- textConnection(Lines2) # Lines2 is the aggregated data 
Data2 <- read.table(zz,header=T,sep=",",stringsAsFactors=F) 
close(zz) 

> merge(Data,Data2[-1],all=T) 
    Month    Date Outdoor Indoor OutdoorAVE 
1 Dec 12/01/2000 02:00  27  26  31.33 
2 Dec 12/01/2000 03:00  39  24  31.33 
3 Dec 12/31/2000 23:00  28  25  31.33 
4 Feb 02/01/2000 01:00  29  25  31.67 
5 Feb 02/01/2000 02:00  27  26  31.67 
6 Feb 02/01/2000 03:00  39  24  31.67 
7 Jan 01/01/2000 01:00  30  25  31.33 
8 Jan 01/01/2000 02:00  31  26  31.33 
9 Jan 01/01/2000 03:00  33  24  31.33 
+0

@ जोरीस मेयस: मेरी समस्या यह है कि आउटडोरएवी एक और डेटाफ्रेम (डेटा.मोनथ कहता है) पर है, जिसमें केवल महीने और औसत कॉलम हैं, और सालाना केवल 12 पंक्तियां हैं। जैसा कि आप उपरोक्त लिखते हैं, आउटडोर आउटवे की गणना वार्षिक घंटे के डेटा के कुल (दैनिक तब मासिक) से नहीं की जाती है। तो मैं चाहता हूं कि मूल डेटाफ्रेम (यानी ऊपर दिए गए उदाहरण में डेटा) में कॉलम जोड़ना है जहां कॉलम को किसी अन्य डेटा सेट (जैसे डेटा। मॉन्थली) से लिया जाता है। – ery

+0

@ery: आपको यह दिखाने के लिए मेरा जवाब संपादित किया गया कि –

+0

@ery का उपयोग कैसे करें: अपनी टिप्पणी में, आप कहते हैं कि 'डेटा। मॉन्थली' में केवल 2 कॉलम (महीने और औसत) हैं, लेकिन आपके मूल प्रश्न में 3 कॉलम हैं। –

0

यहां एक चिड़ियाघर/एक्सटीएस समाधान है। ध्यान दें कि Month यहां संख्यात्मक है क्योंकि आप चिड़ियाघर/xts वस्तुओं में प्रकारों को मिश्रित नहीं कर सकते हैं।

require(xts) # loads zoo too 
Lines1 <- "Date,Outdoor,Indoor 
01/01/2000 01:00,30,25 
01/01/2000 02:00,31,26 
01/01/2000 03:00,33,24 
02/01/2000 01:00,29,25 
02/01/2000 02:00,27,26 
02/01/2000 03:00,39,24 
12/01/2000 02:00,27,26 
12/01/2000 03:00,39,24 
12/31/2000 23:00,28,25" 
con <- textConnection(Lines1) 
z <- read.zoo(con, header=TRUE, sep=",", 
    format="%m/%d/%Y %H:%M", FUN=as.POSIXct) 
close(con) 

zz <- merge(z, Month=.indexmon(z), 
    OutdoorAVE=ave(z[,1], .indexmon(z), FUN=mean)) 
zz 
#      Outdoor Indoor Month OutdoorAVE 
# 2000-01-01 01:00:00  30  25  0 31.33333 
# 2000-01-01 02:00:00  31  26  0 31.33333 
# 2000-01-01 03:00:00  33  24  0 31.33333 
# 2000-02-01 01:00:00  29  25  1 31.66667 
# 2000-02-01 02:00:00  27  26  1 31.66667 
# 2000-02-01 03:00:00  39  24  1 31.66667 
# 2000-12-01 02:00:00  27  26 11 31.33333 
# 2000-12-01 03:00:00  39  24 11 31.33333 
# 2000-12-31 23:00:00  28  25 11 31.33333 

अद्यतन: कैसे दो अलग-अलग डेटा सेट का उपयोग करके उपरोक्त परिणाम मिलता है।

Lines2 <- "Date,Month,OutdoorAVE 
01/01/2000,Jan,31.33 
02/01/2000,Feb,31.67 
12/01/2000,Dec,31.33" 
con <- textConnection(Lines2) 
z2 <- read.zoo(con, header=TRUE, sep=",", format="%m/%d/%Y", 
    FUN=as.POSIXct, colClasses=c("character","NULL","numeric")) 
close(con) 

zz2 <- na.locf(merge(z1, Month=.indexmon(z1), OutdoorAVE=z2))[index(z1)] 
# same output as zz (above) 
+0

मैंने कोशिश की, लेकिन महीना हमेशा पूरे वर्ष के लिए 11 है। – ery

+0

@ery: कृपया मेरा संपादन देखें। मुझे यकीन नहीं है कि महीना हमेशा 11 क्यों होगा ... शायद आपका उदाहरण डेटा और वास्तविक डेटा भिन्न है? –

2

यह आपके सवाल का स्पर्शरेखा है, लेकिन आप के बजाय विभिन्न एकीकृत मान के लिए RSQLite और एक अलग तालिकाओं का उपयोग करने के लिए है, और सरल SQL कमांड के साथ टेबल में शामिल होने के लिए चाहते हो सकता। यदि आप कई प्रकार के एकत्रीकरण का उपयोग करते हैं तो आपका डेटा फ्रेम आसानी से बड़ा और बदसूरत हो सकता है।

+0

यह एक अच्छा समाधान है, लेकिन मुझे यह भी नहीं पता कि SQLite में दिनांक/समय कैसे आयात करें, इसे महीने या दिन तक समूहित करने के लिए बहुत कम है। कोई मदद? – ery

+1

आपकी पूरी समस्या SQL में हल की जा सकती है। मैं नहीं कहता कि आपको एकत्रीकरण के लिए एसक्यूएल का उपयोग करना चाहिए, लेकिन यह जानना उपयोगी है कि यह कैसे काम करता है (बल्कि आसान)। मेरा सुझाव है कि आप कुछ पढ़ते हैं और अलग-अलग धागे में अपने प्रश्न पूछते हैं। – GaBorgulya