Различия значений на основе средних месяцев и скользящих данных - PullRequest
3 голосов
/ 19 января 2012

Я пытаюсь сделать что-то, что кажется простым, но оказывается немного сложным, поэтому я надеюсь, что кто-то может помочь!
У меня есть временной ряд наблюдений температуры:

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

Это всего лишь пример - мои данные хранятся много лет, поэтому я могу рассчитать полное среднемесячное значение данных.
Затем я хочу вычислить разницу вдля всего января (индивидуально) со средним январем, который я вычислил выше.

Если я откажусь от использования класса Date / Time, я мог бы сделать это с некоторыми циклами, но я хочу посмотреть, есть ли "аккуратный" способ сделать это в R?Есть идеи?

Ответы [ 2 ]

1 голос
/ 19 января 2012

По крайней мере, как я понимаю ваш вопрос, вы хотите, чтобы различия каждого месяца со средним значением тех месяцев, поэтому вы, вероятно, хотите использовать 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"]]. В данном случае он возвращает все 0, что является правильным ответом, поскольку для каждого месяца существует только одно значение.

1 голос
/ 19 января 2012

Вы можете просто добавить год в качестве агрегирующей переменной. Это проще, используя интерфейс формулы:

> 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
...