आर

2015-05-30 18 views
7

में महीने में सारांश पंक्तियां तो मेरे पास एक डेटा फ्रेम है जिसमें दिनांक कॉलम, एक घंटा कॉलम और अन्य संख्यात्मक कॉलम की एक श्रृंखला है। डेटा फ्रेम में प्रत्येक पंक्ति पूरे वर्ष के लिए 1 घंटा का 1 घंटा है।आर

डेटा फ्रेम इस तरह दिखता है: क्योंकि यह एक और डेटा फ्रेम से subsetted है

  Date Hour Melbourne Southern Flagstaff 
1 2009-05-01  0   0   5   17 
2 2009-05-01  2   0   2   1 
3 2009-05-01  1   0  11   0 
4 2009-05-01  3   0   3   8 
5 2009-05-01  4   0   1   0 
6 2009-05-01  5   0  49   79 
7 2009-05-01  6   0  425  610 

घंटे क्रम से बाहर हैं।

मैं संख्यात्मक रूप से संख्याओं और संभवतः दिन के आधार पर मानों को जोड़ना चाहता हूं। क्या कोई जानता है मैं ऐसा कैसे कर सकता हूँ?

उत्तर

7

मैं डेटा द्वारा

data <- read.table(text=" Date Hour Melbourne Southern Flagstaff 
         1 2009-05-01 0 0 5 17 
         2 2009-05-01 2 0 2 1 
         3 2009-05-01 1 0 11 0 
         4 2009-05-01 3 0 3 8 
         5 2009-05-01 4 0 1 0 
         6 2009-05-01 5 0 49 79 
         7 2009-05-01 6 0 425 610", 
        header=TRUE,stringsAsFactors=FALSE) 

सेट बनाते हैं तो आप समारोह aggregate साथ योग कर सकते हैं: ?aggregate पर

byday <- aggregate(cbind(Melbourne,Southern,Flagstaff)~Date, 
      data=data,FUN=sum) 
library(lubridate) 
bymonth <- aggregate(cbind(Melbourne,Southern,Flagstaff)~month(Date), 
      data=data,FUN=sum) 

देखो समारोह बेहतर समझने के लिए। (है कि क्योंकि आसान समझा बनाता है) अंतिम तर्क के साथ शुरू तर्क हों:

  • FUN समारोह है कि एकत्रीकरण के लिए इस्तेमाल किया जाना चाहिए है। मैं मानों को पूरा करने के लिए sum का उपयोग करता हूं, लेकिन मैं mean, max या कुछ फ़ंक्शन भी लिख सकता हूं जो आपने स्वयं लिखा था।
  • data का उपयोग उस डेटा फ्रेम को इंगित करने के लिए किया जाता है जिसे मैं एकत्र करना चाहता हूं।
  • पहला तर्क फ़ंक्शन को बताता है कि मैं वास्तव में क्या करना चाहता हूं। ~ के बाईं तरफ, मैं उन चरों को इंगित करता हूं जिन्हें मैं एकत्र करना चाहता हूं। यदि एक से अधिक हैं, तो वे cbind के साथ संयुक्त होते हैं। दाईं तरफ वेरिएबल है जिसके द्वारा डेटा विभाजित किया जाना चाहिए। Date डालने का अर्थ है कि कुल Date के प्रत्येक विशिष्ट मान के लिए चर को जोड़ देगा।

महीने से एकत्रीकरण के लिए, मैं पैकेज lubridate से समारोह month इस्तेमाल किया। यह वही करता है जो किसी को उम्मीद करता है: यह एक संख्यात्मक मान देता है जो किसी दिए गए दिनांक के लिए महीने को इंगित करता है। शायद आपको पहले पैकेज को install.packages("lubridate") द्वारा स्थापित करने की आवश्यकता है।

आप lubridate उपयोग नहीं करना चाहते हैं, तो आप के बजाय निम्न कर सकता है:

data <- transform(data,month=as.numeric(format(as.Date(Date),"%m"))) 
bymonth <- aggregate(cbind(Melbourne,Southern,Flagstaff)~month, 
        data=data,FUN=sum) 

यहाँ मैं महीने में शामिल है और फिर उस स्तंभ के आधार पर संकलित है कि डेटा में एक नया कॉलम जोड़ा।

+0

मैं पर एक त्रुटि हो रही है का उपयोग कर किया जा सकता है लाइब्रेरी (लुब्र्रिडेट) लाइन। डोई को मैन्युअल रूप से पैकेज आयात करने की आवश्यकता है? – user2787386

+1

क्या आपने इसे पहले स्थापित किया है? 'स्थापित करें।पैकेज ("लुब्रिडेट") ' –

+0

इसके बारे में क्षमा करें ... हां, आपको पैकेज को इंस्टॉल करना होगा जैसा कि @Marta Cz-C द्वारा वर्णित है। – Stibu

7

यह एक और तरीका यह है data.table

library(data.table) 
# Edited as per Arun's comment 
out = setDT(data)[, lapply(.SD, sum), by=Date] 

#>out 
#   Date Hour Melbourne Southern Flagstaff 
#1: 2009-05-01 21   0  496  715 

या द्वारा का उपयोग कर dplyr

library(dplyr) 
out = data %>% group_by(Date) %>% summarise_each(funs(sum)) 

#>out 
#Source: local data frame [1 x 5] 
#  Date Hour Melbourne Southern Flagstaff 
#1 2009-05-01 21   0  496  715 
+3

डेटा.table में आपके dplyr समाधान के बराबर है: 'setDT (डेटा) [, lapply (.SD, sum), = date]' – Arun

+0

हाँ वास्तव में !, धन्यवाद अरुण। मैं अब बदलाव कर दूंगा। –

4

एक और आधार आर समाधान

# to sum by date 
rowsum(dat[-1], dat$Date) 
#   Hour Melbourne Southern Flagstaff 
#2009-05-01 21   0  496  715 

# or by month and year 
rowsum(dat[-1], format(dat$Date, "%b-%y")) 
#  Hour Melbourne Southern Flagstaff 
#May-09 21   0  496  715