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 でこれを行うための「きちんとした」方法があるかどうかを確認したいですか? 何か案は?

4

2 に答える 2

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が返されます。

于 2012-01-19T16:23:27.417 に答える
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
于 2012-01-19T16:21:24.927 に答える