Скользящее среднее с изменением размера окна в большом наборе данных - PullRequest
0 голосов
/ 05 сентября 2018

Я хочу вычислить скользящее среднее по вектору, при котором окно увеличивается с каждой записью в векторе. По сути, я хочу иметь среднее значение всех элементов вплоть до i -го, i+1 -го, i+2 -го и т. Д.

Для большей ясности я приведу пример и решение, которое работает для небольших наборов данных, но плохо масштабируется:

library(zoo)

# data:
x <- 1:100

# solution:
rolling_average <- rollapply(x, seq_along(x), mean, align = "right")

# result:
rolling_average
# [1]  1.0  1.5  2.0  2.5  3.0  3.5  4.0  4.5  5.0  5.5  6.0  6.5  7.0  7.5  8.0  8.5  9.0  9.5 10.0 10.5 11.0 11.5 12.0 12.5 13.0 13.5
# [27] 14.0 14.5 15.0 15.5 16.0 16.5 17.0 17.5 18.0 18.5 19.0 19.5 20.0 20.5 21.0 21.5 22.0 22.5 23.0 23.5 24.0 24.5 25.0 25.5 26.0 26.5
# [53] 27.0 27.5 28.0 28.5 29.0 29.5 30.0 30.5 31.0 31.5 32.0 32.5 33.0 33.5 34.0 34.5 35.0 35.5 36.0 36.5 37.0 37.5 38.0 38.5 39.0 39.5
# [79] 40.0 40.5 41.0 41.5 42.0 42.5 43.0 43.5 44.0 44.5 45.0 45.5 46.0 46.5 47.0 47.5 48.0 48.5 49.0 49.5 50.0 50.5

Использование этого подхода для вектора с 500000 записей заполняет мою память за считанные секунды и делает мой компьютер непригодным для использования. Кроме того, я попытался использовать roll_mean из RcppRoll, но не смог найти решение, потому что RcppRoll::roll_mean принимает только целые числа в качестве длины окна.

Итак, как лучше всего решить эту проблему в больших масштабах? Любая помощь с благодарностью.

Ответы [ 2 ]

0 голосов
/ 06 сентября 2018

Мы можем использовать cummean

library(dplyr)
cummean(x)
#[1]  1.0  1.5  2.0  2.5  3.0  3.5  4.0  4.5  5.0  5.5  6.0  6.5  7.0  7.5  8.0  8.5  9.0  9.5 10.0
#[20] 10.5 11.0 11.5 12.0 12.5 13.0 13.5 14.0 14.5 15.0 15.5 16.0 16.5 17.0 17.5 18.0 18.5 19.0 19.5
#[39] 20.0 20.5 21.0 21.5 22.0 22.5 23.0 23.5 24.0 24.5 25.0 25.5 26.0 26.5 27.0 27.5 28.0 28.5 29.0
#[58] 29.5 30.0 30.5 31.0 31.5 32.0 32.5 33.0 33.5 34.0 34.5 35.0 35.5 36.0 36.5 37.0 37.5 38.0 38.5
#[77] 39.0 39.5 40.0 40.5 41.0 41.5 42.0 42.5 43.0 43.5 44.0 44.5 45.0 45.5 46.0 46.5 47.0 47.5 48.0
#[96] 48.5 49.0 49.5 50.0 50.5
0 голосов
/ 05 сентября 2018

Мы можем сделать

cumsum(x) / seq_along(x)
#  [1]  1.0  1.5  2.0  2.5  3.0  3.5  4.0  4.5  5.0  5.5  6.0  6.5  7.0  7.5  8.0  8.5  9.0  9.5 10.0 10.5
# [21] 11.0 11.5 12.0 12.5 13.0 13.5 14.0 14.5 15.0 15.5 16.0 16.5 17.0 17.5 18.0 18.5 19.0 19.5 20.0 20.5
# [41] 21.0 21.5 22.0 22.5 23.0 23.5 24.0 24.5 25.0 25.5 26.0 26.5 27.0 27.5 28.0 28.5 29.0 29.5 30.0 30.5
# [61] 31.0 31.5 32.0 32.5 33.0 33.5 34.0 34.5 35.0 35.5 36.0 36.5 37.0 37.5 38.0 38.5 39.0 39.5 40.0 40.5
# [81] 41.0 41.5 42.0 42.5 43.0 43.5 44.0 44.5 45.0 45.5 46.0 46.5 47.0 47.5 48.0 48.5 49.0 49.5 50.0 50.5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...