xtsライブラリを使ってみる−1

(その2はコチラ
先日、R勉強会に参加させていただいたときに
「時系列のデータ構造を扱う際にはxtsパッケージが便利なのではないか?」
というアドバイスをいただいたので使ってみる。

まずはマニュアルのほぼ写経コード

library(xts)
data(sample_matrix)
#その名の通り行列形式でデータが入っている
head(sample_matrix)

#xtsオブジェクトへ!
sample.xts <- as.xts(sample_matrix, descr='テストデータです')
#zooパッケージのクラスとxtsクラスの属性を持っているようだ
class(sample.xts)
str(sample.xts)

#headを使うとdescrの属性の値は見えないので、無理やりだしてみる。
head(sample.xts) 
attr(sample.xts,'descr')

#いろいろなデータの抜き方
#2007年全部(このデータだともともと2007年のデータしかないが・・・
sample.xts['2007']
#2007年3月1日以降のデータ
sample.xts['2007-03::']
#2007年3月1日〜2007年4月30日までのデータ(ちょっと不思議な挙動)
sample.xts['2007-03::2007-04']
#こう書くと2007年3月1日〜2007年4月1日までのデータ
sample.xts['2007-03::2007-04-01']
#データの最初っから2007年1月31日まで
sample.xts['::2007-01-31'] 
#2007年1月3日のデータだけ
sample.xts['2007-01-03']

んー、日付に応じてデータ抜くのが超便利そうだ。
もうちょっと調べて使ってみる。

#月末がどのインデックスになるのか?を抜いてくる関数。超便利。
#'on'オプションで指定すれば年、週、日、秒等等もいける。
index.monthlast <- endpoints(sample.xts)
#月末だけのデータを取得
sample.xts[index.monthlast]

#period.〜関数群。↑のendpoints関数とあわせて使うと強力
#期間を指定して、その範囲内でmax,min,sum,などを計算する。period.applyを使えば自作関数も。
#各月ごとの1列目の値の和
period.sum(sample.xts[,1],endpoints(sample.xts))
#各月ごとの1列目の値の最大値
period.max(sample.xts[,1],endpoints(sample.xts))
#period.applyで上と同じ動作を
period.apply(sample.xts[,1],endpoints(sample.xts),function(x_){max(x_)})

#さらに、各日・月・週・四半期・年ごとに処理をapplyしちゃう関数群もある。
#要するに上の関数をさらにendpointsなしに圧縮して書くことができる。
#各月ごとの1列目の最大値
apply.monthly(sample.xts[,1],max)
#各週ごとの1列目の平均値
apply.weekly(sample.xts[,1],mean)

#Rにデフォルトで入っていてもよさそうな、データの初めの要素と終わりの要素を抜く関数もあった
#いちいちhead(x,1)みたいに書くのめんどいよね。
first(sample.xts)
last(sample.xts)

#データが何日・年・四半期分あるか。
ndays(sample.xts)
nyears(sample.xts)
nquarters(sample.xts)

おぉ、これはかなり便利だ!period.apply最強。
マニュアルを隅から隅まで読んでもいいな。
【補足】
xtsパッケージに関するわかりやすい解説が載っている記事。ありがたい。
http://www-csfi.sigmath.es.osaka-u.ac.jp/faculty/personal/fukasawa/20100118.pdf