У меня есть фрейм данных с тремя столбцами: Id
, Date
и Value
, и я хочу уменьшить это значение в среднем: взять следующие 20 строк, построить среднее значение Value
из этих 20 строк и добавить его в новый фрейм данных с той же структурой. Date
должно быть первым значением из 20 строк.
Я пробовал это так (вероятно, ужасно :):
resample.downsample <- function(data, by=20)
{
i <- 0
nmax <- nrow(data)
means <- c()
while(i < nmax)
{
means <- c(means, mean(subset(data, Id > i & Id <= i+by)$Value))
i <- i+by
}
return (
data.frame(
Id = seq(1, length.out=(nmax/by), by=1),
Date = seq(startDate, length.out=(nmax/by), by=(1/by)),
Value = means
)
)
}
Это работает так для небольших наборов данных, но всегда работает на моих реальных наборах данных (~ 4000000 строк). Есть идеи, как оптимизировать эту функцию?
Sample-Data (входные и выходные данные должны иметь одинаковую структуру, классы: целые, числовые, POSIXct / POSIXt):
Value Id Date
1 125 1 2011-06-30 22:41:50
2 127 2 2011-06-30 22:41:50
3 126 3 2011-06-30 22:41:50
4 123 4 2011-06-30 22:41:50
5 130 5 2011-06-30 22:41:50
6 131 6 2011-06-30 22:41:50
7 128 7 2011-06-30 22:41:50