2015-10-19 6 views
9

मैं एक "तिथि" वेक्टर, कि dd/mm/yyyy प्रारूप में दिनांक शामिल है:मैं आर में अपने महीने परिवर्तक को महीने/वर्ष में कैसे समूहित करूं?

head(Entered_Date,5) 
[1] 1/5/1998 1/5/1998 1/5/1998 1/5/1998 1/5/1998 

मैं तिथि के खिलाफ एक आवृत्ति चर साजिश की कोशिश कर रहा हूँ, लेकिन मैं समूह के लिए चाहते दिनांकों यह है कि महीने या साल तक। जैसा कि अब है, प्रति दिन एक आवृत्ति है, लेकिन मैं आवृत्ति को महीने या वर्ष तक साजिश करना चाहता हूं। तो 1/5/19 9 8 के लिए 1 की आवृत्ति, 1/7/19 9 8 के लिए 1 और 1/8/19 9 8 के लिए 3, मैं इसे 1/19 9 8 के लिए 5 के रूप में प्रदर्शित करना चाहता हूं। यह 1 99 8 से लेकर वर्तमान तक की तारीखों के साथ अपेक्षाकृत बड़ा डेटा सेट है, और मैं इसे पूरा करने के लिए कुछ स्वचालित तरीका ढूंढना चाहता हूं।

> dput(head(Entered_Date)) 
structure(c(260L, 260L, 260L, 260L, 260L, 260L), .Label = c("1/1/1998", 
"1/1/1999", "1/1/2001", "1/1/2002", "1/10/2000", "1/10/2001", 
"1/10/2002", "1/10/2003", "1/10/2005", "1/10/2006", "1/10/2007", 
"1/10/2008", "1/10/2011", "1/10/2012", "1/10/2013", "1/11/1999", 
"1/11/2000", "1/11/2001", "1/11/2002", "1/11/2005", "1/11/2006", 
"1/11/2008", "1/11/2010", "1/11/2011", "1/11/2012", "1/11/2013", 
"1/12/1998", "1/12/1999", "1/12/2001", "1/12/2004", "1/12/2005", ... 
+2

पुनरुत्पादित परिणामों के बारे में सुनिश्चित करने के लिए, कृपया आउटपुट पोस्ट करें एफ 'डंप (हेड (Entered_Date))' –

+0

'zoo' पैकेज से 'as.yearmon' पर एक नज़र डालें। – Jaap

उत्तर

13

यहां dplyr का उपयोग करके एक उदाहरण दिया गया है। आप format कथन में %m या वर्ष %Y के लिए संबंधित दिनांक प्रारूप स्ट्रिंग का उपयोग करें।

set.seed(123) 
df <- data.frame(date = seq.Date(from =as.Date("01/01/1998", "%d/%m/%Y"), 
           to=as.Date("01/01/2000", "%d/%m/%Y"), by="day"), 
       value = sample(seq(5), 731, replace = TRUE)) 

head(df) 
     date value 
1 1998-01-01  2 
2 1998-01-02  4 
3 1998-01-03  3 
4 1998-01-04  5 
5 1998-01-05  5 
6 1998-01-06  1 

library(dplyr) 

df %>% 
mutate(month = format(date, "%m"), year = format(date, "%Y")) %>% 
group_by(month, year) %>% 
summarise(total = sum(value)) 

Source: local data frame [25 x 3] 
Groups: month [?] 

    month year total 
    (chr) (chr) (int) 
1  01 1998 105 
2  01 1999 91 
3  01 2000  3 
4  02 1998 74 
5  02 1999 77 
6  03 1998 96 
7  03 1999 86 
8  04 1998 91 
9  04 1999 95 
10 05 1998 93 
.. ... ... ... 
+0

एक आकर्षण की तरह काम करता है धन्यवाद –

+0

एक बात, मैं महीने के नाम के रूप में महीने के नाम के रूप में दिखाने के लिए महीने कैसे प्राप्त करूं? –

+0

@Learning_R आपको अपने डेटा का पूर्ण पुनरुत्पादन सेट प्रदान करने की आवश्यकता है। आपका 'ड्यूटी' काट दिया गया है, इसलिए मैं इस डेटा समस्या को पुन: पेश करने के लिए आपका डेटा नहीं प्राप्त कर सकता हूं जहां मेरा उदाहरण नाम प्रदान करता है। – cdeterman

1

हो सकता है कि आप सिर्फ एक स्तंभ आपके डेटा में इस तरह जोड़ें:

Year <- format(as.Date(Entered_Date, "%d/%m/%Y"), "%Y")

+0

अगर मैं महीने और वर्ष चाहता था, तो मैं इसे कैसे करूं, जैसे कि 1/2000, 2/2000, ... –

+0

"% m /% y" कोष्ठक से पहले अंतिम बिट बदलें ... '? Strptime' आपको इन सभी दिनांक स्वरूपण विकल्पों के लिए एक कुंजी देगा। –

1

न की जरूरत है dplyr?as.POSIXlt

df$date<-as.POSIXlt(df$date) 
mon<-df$date$mon 
yr<-df$date$year 
monyr<-as.factor(paste(mon,yr,sep="/")) 
df$date<-monyr 

को देखो बात की इस तरह के ggplot2 लेकिन इसकी अच्छा उपयोग करने की आवश्यकता है।

c <- ggplot(df, aes(factor(date))) 
c + geom_bar() 

आप वास्तविक संख्या

aggregate(. ~ date,data = df,FUN=length) 
df2<-aggregate(. ~ date,data = df,FUN=length) 
df2 
    date value 
1 0/98 31 
2 0/99 31 
3 1/98 28 
4 1/99 28 
5 10/98 30 
6 10/99 30 
7 11/97  1 
8 11/98 31 
9 11/99 31 
10 2/98 31 
11 2/99 31 
12 3/98 30 
13 3/99 30 
14 4/98 31 
15 4/99 31 
16 5/98 30 
17 5/99 30 
18 6/98 31 
19 6/99 31 
20 7/98 31 
21 7/99 31 
22 8/98 30 
23 8/99 30 
24 9/98 31 
25 9/99 31 
0

एक सुपर आसान तरीका कटौती() फ़ंक्शन का उपयोग नहीं है देखना चाहते हैं:

list = as.Date(c("1998-5-2", "1993-4-16", "1998-5-10")) 
    cut(list, breaks = "month") 

और आप इस मिल जाएगा:

[1] 1998-05-01 1993-04-01 1998-05-01 
    62 Levels: 1993-04-01 1993-05-01 1993-06-01 1993-07-01 1993-08-01 ... 1998-05-01 
संबंधित मुद्दे

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