R言語でデータを集計したりする時に、年度単位で集計したかったりしませんか。
意外とそのような方法がなかったので、ここの掲載しておきます。
テストデータの作成
まず、テストデータを作成します。今回は、日経平均株価のデータを使います。取得方法は、基本的に以下のページを参考にしています。ほとんどこの記事に書いてある通りにやれば良いと思いますが、僕の環境(Mac)では、ダウンロードしたファイルがそのままだと文字コードエラーになってしまったので、ヘッダーを適当にアルファベットに編集しています。
【R言語】日次データオブジェクトに、曜日列を挿入する – Qiita
一応、ソースコードを掲載しておきますね。
nikkei225 <- read.csv("nikkei_stock_average_daily_jp.csv") #末尾に空行があるので削除 nikkei225 <- nikkei225[-857, ]
これで、2013年から2016年までの、日次の株価に関するデータを用意できました。
年と月で集計する
作成したテストデータから、年と月のマトリックスで集計したデータを作成します。具体的なステップとしては、今の日付のデータから、「年」と「月」をそれぞれ抽出し、それを掛け合わせるようにテーブルデータを作成します。
#年と月のデータを作成 data.year <- format(as.Date(nikkei225$date),"%Y") data.month <- months(as.Date(nikkei225$date)) #データを結合 nikkei225 <- data.frame(nikkei225, data.year, data.month) #テーブルで集計 table(nikkei225$data.year, nikkei225$data.month)
これでテーブルは、以下の通りになります。各年における東証が開かれた日数がカウントされました。
10月 | 11月 | 12月 | 1月 | 2月 | 3月 | 4月 | 5月 | 6月 | 7月 | 8月 | 9月 | |
2013 | 22 | 20 | 20 | 19 | 19 | 20 | 21 | 21 | 20 | 22 | 22 | 19 |
2014 | 22 | 18 | 21 | 19 | 19 | 20 | 21 | 20 | 21 | 22 | 21 | 20 |
2015 | 21 | 19 | 21 | 19 | 19 | 22 | 21 | 18 | 22 | 22 | 21 | 19 |
2016 | 0 | 0 | 0 | 19 | 20 | 22 | 20 | 19 | 22 | 1 | 0 | 0 |
今回は、これを年度のデータにしたいので、変換します。また、列も10月から始まっていて変な風になっているので、これも修正したいですね。
年度の算出
年度ごとに分類するためには、「境目となる月より過ぎていれば1を足す」という処理をしてあげます。
#各年度でデータを仕分ける fiscalYear <- as.numeric(format(as.POSIXlt(nikkei225$date,format="%Y/%M/%d"),"%Y")) + (format(as.POSIXlt(nikkei225$date,format="%Y/%M/%d"), "%M") >= "04") - 1 #年度データを結合して集計 nikkei225 <- data.frame(nikkei225, fiscalYear) sum.date <- table(nikkei225$fiscalYear, nikkei225$data.month) #最後に列の順番を入れ替える sum.date <- sum.date[,c(7,8,9,10,11,12,1,2,3,4,5,6)]
以上で、やっと出来上がりです。これを出力すると、以下のようになります。テストデータは2013年1月からなので、2012年度開始でちゃんと出力されていますね。
4月 | 5月 | 6月 | 7月 | 8月 | 9月 | 10月 | 11月 | 12月 | 1月 | 2月 | 3月 | |
2012 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 19 | 19 | 20 |
2013 | 21 | 21 | 20 | 22 | 22 | 19 | 22 | 20 | 20 | 19 | 19 | 20 |
2014 | 21 | 20 | 21 | 22 | 21 | 20 | 22 | 18 | 21 | 19 | 19 | 22 |
2015 | 21 | 18 | 22 | 22 | 21 | 19 | 21 | 19 | 21 | 19 | 20 | 22 |
2016 | 20 | 19 | 22 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
これらの処理は、以下のサイトを参考にさせていただきました。