2014-01-07 3 views
2

Я нахожу это довольно сложным. У меня есть временная рамка данных R, состоящая из значения для каждого дня в течение примерно 50 лет данных. Я хотел бы вычислить среднее значение только последних 5 значений за каждый месяц. Это было бы просто, если бы каждый месяц закончился в тот же 31-й день, и в этом случае я мог бы просто подмножество. Однако, как мы все знаем, некоторые месяцы заканчиваются в 31, некоторые из 30, а затем у нас високосные годы. Итак, есть ли простой способ сделать это в R без необходимости писать сложную функцию индексирования, чтобы учесть все возможности, включая високосные годы? Возможно, функция, которая работает на объектах типа зоопарка? Кадр данных выглядит следующим образом:Среднее вычисление последних 5 дней каждого месяца в R

 Date val 
1 2014-01-06 1.49 
2 2014-01-03 1.38 
3 2014-01-02 1.34 
4 2013-12-31 1.26 
5 2013-12-30 2.11 
6 2013-12-26 3.20 
7 2013-12-25 3.00 
8 2013-12-24 2.89 
9 2013-12-23 2.90 
10 2013-12-22 4.5 
+1

См. Http://stackoverflow.com/questions/8333838/how-do-you-generate-a-sequence-of-the-last-day-of-the-month-over-two-years-in- r –

ответ

3

tapply Попробуйте это где dd ваш кадр данных, и мы предположили, что Date столбец класса "Date". (Если dd уже отсортированы в порядке убывания Date, как представляется, это может быть в этом вопросе, то мы можем сократить его немного, заменив анонимную функцию с function(x) mean(head(x, 5)).)

> tapply(dd$val, format(dd$Date, "%Y-%m"), function(x) mean(tail(sort(x), 5))) 
2013-12 2014-01 
2.492000 1.403333 

aggregate.zoo В терминах зоопарка мы можем сделать это, что возвращает другой объект зоопарка, а его индекс имеет класс "yearmon". (В случае зоопарка не имеет значения dd отсортирована ли или нет, так как зоопарк будет сортировать его автоматически.)

> library(zoo) 
> z <- read.zoo(dd) 
> aggregate(z, as.yearmon, function(x) mean(tail(x, 5))) 
Dec 2013 Jan 2014 
2.492000 1.403333 

ПЕРЕСМОТРЕННЫХ. Сделали некоторые исправления.

+0

Огромное спасибо, это работает довольно хорошо, похоже, что tapply делает большую часть группировки/агрегации, которую я пытался сделать в фоновом режиме. Я также не знал, что применение может принимать пользовательские функции в качестве входных данных. – user2238328