2015-03-16 8 views
-1

Я хочу создать 7-дневное скользящее среднее для ежедневной физической тренировочной нагрузки в течение года, рассчитанное для каждого спортсмена в учебной группе.Создайте 7-дневное скользящее среднее по группе

Набор данных называется «daily.load». Векторы: «Дата», «Имя», «Тотал.Лад»

Идеальный конечный результат - это скользящее 7-дневное среднее значение для «Total.Load» как четвертого вектора, называемого «Rolling.Average» в набор данных 'daily.load'.

Я пытаюсь сделать это с помощью rollmean, но я становлюсь застревающим, когда дело доходит до того, что функция будет генерировать скользящее среднее для спортсмена.

Любая помощь была бы очень признательна.

Matt

ответ

1

Существует by аргумента в data.table, поэтому расчет прокатки имеет в виде спортсмена не должна быть проблемой. Ниже приведен воспроизводимый пример, где я вычислил скользящее среднее значение с rollmean. Также обратите внимание, что RcppRoll::roll_mean, вероятно, быстрее, чем zoo::rollmean.

# load packages 
require(data.table) 
require(zoo) 
# create data 
Ndays <- 100 
Nnames <- 5 
daily.load <- data.table(Date = rep(Sys.Date() - seq.int(Ndays, 1), times = Nnames), 
         Name = rep(LETTERS[seq(Nnames)], each=Ndays), 
         Total.Load = rnorm(Ndays*Nnames, 100, 5)) 
setkey(daily.load, "Name", "Date") 
# calculate rolling average by Name 
daily.load[, Rolling.Average := rollmean(Total.Load, 7, fill = NA), by = Name] 
+0

Благодарим за этот ответ. Я думаю, что когда я выполнял эту команду, он искал 100 дней и 5 спортсменов, но эти значения будут отличаться между группами и внутри них. Мне интересно, знаете ли вы метод использования аргумента group group в data.table, который позволяет команде перемещаться по набору данных и определять длину Ndays и Nnames против меня, определяя длину? Требуется ли для этого функция? Любая помощь будет принята с благодарностью. Я новичок в R, и это меня насторожило. –

+0

100 дней и 5 спортсменов использовались только для генерации данных. Расчет скользящего среднего не нуждается в этом. Вы должны иметь возможность запускать команду в своих данных. – shadow

+0

Я использовал два разных способа, включая команды Ndays <-100 и Nnames <- 5, и без них. Он генерирует таблицу данных, в которой имена спортсменов были заменены символами от A до E и генерировали 100 точек данных для каждого объекта. Он также перезаписал переменную Total.Load с новым значением (не уверен, что это такое). Кажется, я что-то пропустил. Есть предположения? Большое вам спасибо за вашу помощь. –

0

Спасибо, Тень. Точный код, который работал был:

setDT (daily.load)

daily.load [, Rolling.Average: = rollmean (Total.Load, 7, заполнить = NA, выровнять = "право"), by = Name]

Выравнивание = "право" против align = "center" - отличный вариант. Также помните, что R-неофиты различают, есть ли у вас таблица данных или кадр данных.