2012-01-19 5 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 

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

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

+0

Я немного очистил ваш код, но не могу получить то, что вы говорите, что 'mean.ts' (т.е. значения чуть более 1). – James

+0

Маленький наконечник. Начиная с 2.14, 'read.table' имеет аргумент' text'. –

+0

Вы могли бы также использовать 'as.POSIXlt (DF [[" Date "]]) $ mon', хотя 'format' все еще проще IMO. –

ответ

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

Если вы хотите его в том же dataframe, а затем просто назначить его в качестве колонки:

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

ave функция является предназначен для добавления столбцов в существующие фреймы данных, потому что он возвращает вектор той же длины, что и число значений в его первом аргументе, в данном случае DF [[«Значение»]]. В данном случае он возвращает все 0, что является правильным ответом, потому что для каждого месяца существует только одно значение.

+0

Спасибо! Это именно то, что я был после! –

 Смежные вопросы

  • Нет связанных вопросов^_^