У меня есть вектор значений, который я хотел бы сообщить о среднем в окнах вдоль меньшего слайда.
Например, для вектора следующих значений:
4, 5, 7, 3, 9, 8
Размер окна 3 и слайд 2 будут делать следующее:
(4+5+7)/3 = 5.33
(7+3+9)/3 = 6.33
(9+8)/3 = 5.67
И вернуть вектор этих значений:
5.33, 6.33, 5.67
Есть ли простая функция, которая сделает это для меня? Если бы это также возвратило индексы начала окна, это было бы добавленным бонусом. В этом примере это будет 1,3,5
Ответы:
Функция
rollapply
в пакете зоопарка приближает вас:Он просто не будет вычислять последнее значение для вас, поскольку он не содержит 3 наблюдения. Может быть, этого будет достаточно для вашей реальной проблемы? Также обратите внимание, что возвращаемый объект имеет нужные вам индексы в
names
качестве возвращаемого вектора.Ваш пример предполагает, что в последнем окне есть ненаблюдаемый 0. Возможно, было бы более полезным или реалистичным дополнить
NA
его представлением недостающей информации и сказать, чтоmean
нужно обрабатывать пропущенные значения. В этом случае мы будем иметь (8 + 9) / 2 как наше окончательное оконное значение.источник
x<-c(x,0)
), чтобы получить последний элемент ответа.na.rm = TRUE
аргументmean
. Ответ не будет таким же, как запрос OP, но он кажется более полезным. Я отредактирую свой ответ, чтобы включить это.Rollapply прекрасно работает с небольшим набором данных. Однако, если вы работаете с несколькими миллионами строк (геномика), это довольно медленно.
Следующая функция супер быстрая.
http://coleoguy.blogspot.com/2014/04/sliding-window-analysis.html
источник
-1
(в диапазон) и a+1
(в цикл).Эта простая строка кода делает вещь:
если
x
это вектор в вопросе.источник
(c(0,0,x)+c(0,x,0)+c(x,0,0))/3
что я имею в виду (и как это работает). Правильная формула будет:(c(0,0,x)+c(0,x,0)+c(x,0,0))[1:(length(x)-3)*2+1]/3
(мы должны сократить 0-отступ в начале и затем выбрать четные элементы.или
источник
Ответ Шеббычефа в R:
РЕДАКТИРОВАТЬ: Индексы, которые вы ищете, просто
idx1
... эта функция может быть легко изменена, чтобы возвращать их, но почти одинаково быстро воссоздать их с другим вызовомseq(1,length(x),by=slide)
.источник
fromo::running_mean
новейшей версии моего пакета fromo .Я легко могу сделать это в Matlab и утке, пока ты меня опускаешь:
как побочный эффект,
idx1
является индексом элемента в сумме. Я уверен, что это можно легко перевести на R. Идиомаfirst:skip:last
в Matlab дает массив first, first + skip, first + 2skip, ..., first + n skip, где последний элемент в массиве не больше чемlast
.редактировать : я опустил часть усреднения (делить на
windowsize
).источник
Это даст вам средство окна и индекс первого значения окна:
Применяются различные предостережения: не проверял это ни против чего, кроме ваших данных выборки; Я считаю, что добавление к таким фреймам данных может быть очень медленным, если у вас много значений (потому что каждый раз будет копироваться data.frame); и т.д. Но он производит то, что вы просили.
источник
rollapply
).rollapply
гораздо проще понять и понять замысел. Кроме того,rollapply
вероятно, было гораздо больше глазных яблок, проверяющих его код, чем то, что я мог бы приготовить однажды днем. Лошади на курсы.[i:(i+2)]
в[i:(i+win.size-1)]
бы сделать код более общим, я думаю.