2012-01-19 8 views
3

私は簡単なことをしようとしていますが、ちょっとした挑戦を証明していますので、誰かが助けてくれることを願っています!
私は温度の観測値の時系列を持っている:平均月数とローリングデータに基づく値の差

Lines <-"1971-01-17 298.9197 
1971-01-17 298.9197 
1971-02-16 299.0429 
1971-03-17 299.0753 
1971-04-17 299.3250 
1971-05-17 299.5606 
1971-06-17 299.2380 
2010-07-14 298.7876 
2010-08-14 298.5529 
2010-09-14 298.3642 
2010-10-14 297.8739 
2010-11-14 297.7455 
2010-12-14 297.4790" 

DF <- read.table(textConnection(Lines), col.names = c("Date", "Value")) 

DF$Date <- as.Date(DF$Date) 

mean.ts <- aggregate(DF["Value"], format(DF["Date"], "%m"), mean) 

これが生成します。

> mean.ts 
    Date Value 
1 01 1.251667 
2 02 1.263333 

これは単なる一例である - 私は完全な毎月の平均値を計算することができますので、私のデータは長年のですデータの
私がしたいことは、1月のすべての(個別に)上記で計算した1月の平均との差を計算することです。

私は、私はいくつかのループでこれを行うことができます日付/時刻のクラスを使用してから離れるが、私はRでこれを行うには、「きちんとした」方法があるかどうかを確認したい場合は?何か案は?

+0

私はあなたのコードを少しきれいにしましたが、 'mean.ts'が(つまり1をちょうど上回る)ということを得ることはできません。 – James

+0

小さなチップ。 2.14以降、 'read.table'には' text'引数があります。 –

+0

あなたは 'as.POSIXlt(DF [[" Date "]])$ mon'を使うこともできましたが、 'format'はもっと簡単です。 –

答えて

1

年を集計変数として追加することができます。これは、式インタフェースを使用して簡単です:

> aggregate(Value~format(Date,"%m")+format(Date,"%Y"),data=DF,mean) 
    format(Date, "%m") format(Date, "%Y") Value 
1     01    1971 298.9197 
2     02    1971 299.0429 
3     03    1971 299.0753 
4     04    1971 299.3250 
5     05    1971 299.5606 
6     06    1971 299.2380 
7     07    2010 298.7876 
8     08    2010 298.5529 
9     09    2010 298.3642 
10     10    2010 297.8739 
11     11    2010 297.7455 
12     12    2010 297.4790 
1

私はあなたがそれらヶ月の平均で毎月の違いをしたいあなたの質問を理解して、あなたはおそらく、あなたは集計ではなくaveを使用したい、少なくともとして:

diff.mean.ts <- ave(DF[["Value"]], 
         list(format(DF[["Date"]], "%m")), FUN=function(x) x-mean(x)) 

あなたが同じデータフレームでそれを望んでいた場合は、単に列として割り当てる:

DF$ diff.mean.ts <- diff.mean.ts 

ave関数であります既存のデータフレームに列を追加するために設計されています。これは、最初の引数の値の数と同じ長さのベクトルを返します。この場合はDF [["Value"]]です。現在の例では、毎月1つの値しかないので、正解であるすべての0を返します。

+0

ありがとう!これはまさに私が後にしたものです! –

関連する問題