R zoo объект агрегации временных рядов - PullRequest
1 голос
/ 05 февраля 2012

У меня есть объект R zoo. Объект зоопарка (z) индексируется по дате и имеет несколько столбцов:

  • V1 (совокупное значение является суммой всех значений в «выбранных» строках)
  • V2 (совокупное значение q1 [первый квартиль] всех значений в «выбранных» строках)
  • V3 (совокупное значение - это минимум всех значений в «выбранных» строках)
  • V4 (совокупное значение является первым значением всех значений в «выбранных» строках)
  • v5 (совокупное значение является последним значением всех значений в «выбранных» строках)

Я хочу объединить данные в каждом «столбце» по-разному (т. Е. С использованием разных функций), но с тем же числом строк.

Я хочу агрегировать, используя функцию, которая позволяет мне указать количество строк, по которым нужно агрегировать. Например:

my_aggregate <- function(data, agg_rowcount) {
  # aggregate data over [agg_rowcount] rows....
  return (aggregated_data)
}

Сначала я думал о реализации этой функции с помощью метко названной функции aggregate (), но я не мог заставить ее делать то, что хотел.

Ниже приведен простой пример, объясняющий ошибку, которую я получаю при использовании aggregate ():

> indices <- seq.Date(as.Date('2000-01-01'),as.Date('2000-01-30'),by="day")
> a <- zoo(rnorm(30), order.by=indices)
> b <- zoo(rnorm(30), order.by=indices)
> c <- zoo(rnorm(30), order.by=indices)
> d <- merge(a,b)
> e <- merge(d,c)
> head(e)
                     a          b           c
2000-01-01 -0.07924078  0.6208785 -1.79826472
2000-01-02  1.15956208  1.1867218 -0.02124817
2000-01-03  0.20427523  0.3164863 -0.20153631
2000-01-04  1.21583902 -1.3728278  1.75872854
2000-01-05 -0.32845708  0.3857658 -1.01082787
2000-01-06 -1.95312879 -0.3824591 -1.33220075
>
> aggregate(e,by=e[[1]], nfrequency=8)
Error: length(time(x)) == length(by[[1]]) is not TRUE

Так что я потерпел неудачу при первом же препятствии. Буду признателен за помощь в написании функции, которая позволит мне объединять разные столбцы по-разному в одинаковом количестве строк.

Примечание: У меня только первые несколько дней «возни» с R. Насколько я знаю, aggregate () не может быть способом решения этой проблемы - я не хочу фрагмент кода выше, чтобы быть красной сельдью, и получить ответы о том, как исправить проблему, которую я получил при использовании агрегатной функции - если IF aggregate () не является «лучшим» (то есть рекомендуемым R) способом решения этой проблемы .

Единственные причины, по которым я включил мою попытку выше:

  1. Потому что меня попросили опубликовать «воспроизводимую» ошибку
  2. Чтобы показать, что я пытался решить это сам, прежде чем спросить здесь.

Ответы [ 2 ]

3 голосов
/ 06 февраля 2012

Предположим, мы хотим агрегировать e по неделям, w, агрегируя столбец a, используя sum, b, используя mean и c, используя последнее значение в неделю:

w <- as.numeric(format(time(e), "%W"))
e.w <- with(e, cbind(a = aggregate(a, w, sum), 
    b = aggregate(b, w, mean), 
    c = aggregate(c, w, tail, 1)
))
0 голосов
/ 17 марта 2013

Не поможет ли здесь функция ddply в пакете plyr?

Для агрегирования по нескольким столбцам:

names(e)[1] = 'group'
agg = ddply(e, c("group"), function(df) { 
    c( sum(df$a), mean(df$b), tail(df$c) ) 
})
names(agg) = c('group', 'a', 'b', 'c')
...