2015-10-19 9 views
9

私はmm/dd/yyyy形式で日付を含む「日付」、ベクター、持っている:私は日付に対する周波数変数をプロットしようとしています日付変数をRで月/年にグループ化するにはどうすればよいですか?

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

を、私はそれがあることを日付のグループにしたいです月または年。今のように、1日あたりの頻度がありますが、頻度を月または年ごとにプロットしたいと思います。したがって、1/5/1998、1/1997/1、3/3/1998の頻度を1の代わりに1/1998の5として表示したいと思います。これは1998年から現在までの比較的大きなデータセットであり、これを達成するための自動化された方法を探したいと思います。

> 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

再現性のある結果が得られるように、出力o 'dput(head(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

1つのこと、月の代わりに月の名前を表示するにはどうすればいいですか? –

+0

@ Learning_Rデータの完全な再現可能なセットを提供する必要があります。あなたの 'dput'は途切れてしまい、私の例が名前を提供しているところで、このラベルの問題を再現するためのデータを得ることができません。 – 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 
関連する問題