Основанное на времени усреднение (скользящее окно) столбцов в data.frame - PullRequest
5 голосов
/ 20 октября 2010

У меня есть data.frame, который имеет несколько столбцов.Один из столбцов - время и, следовательно, не уменьшается.Остальные столбцы содержат наблюдения, записанные во время, заданное временем, указанным в определенной строке data.frame.

Я хочу выбрать окно времени, скажем, «х» секунд, и рассчитать среднее(или, если уж на то пошло, любая функция) записей в некоторых других столбцах в том же data.frame для этого окна.

Конечно, поскольку это среднее по времени число записей в окне, может изменятьсяв зависимости от данных.Это связано с тем, что количество строк, принадлежащих определенному временному окну, может варьироваться.

Я сделал это с помощью пользовательской функции, которая создает новый столбец в data.frame.Новый столбец присваивает один номер всем записям во временном окне.Число уникально во всех временных окнах.Это по существу делит данные на группы на основе временных окон.Затем я использую «агрегатную» функцию R. для вычисления среднего значения.

Мне просто интересно, существует ли существующая функция R, которая может выполнять группировку на основе временного интервала, или есть лучшее (более чистое)способ сделать это.

Ответы [ 2 ]

4 голосов
/ 20 октября 2010

Предполагая, что ваш data.frame содержит только числовые данные, это один из способов сделать это с помощью zoo / xts:

> Data <- data.frame(Time=Sys.time()+1:20,x=rnorm(20))
> xData <- xts(Data[,-1], Data[,1])
> period.apply(xData, endpoints(xData, "seconds", 5), colMeans)
                           [,1]
2010-10-20 13:34:19 -0.20725660
2010-10-20 13:34:24 -0.01219346
2010-10-20 13:34:29 -0.70717312
2010-10-20 13:34:34  0.09338097
2010-10-20 13:34:38 -0.22330363

РЕДАКТИРОВАТЬ: используя только базовые пакеты R. Средние значения одинаковы, но времена немного отличаются, потому что endpoints начинает 5-секундный интервал с первого наблюдения. Приведенный ниже код группируется с 5-секундными интервалами, начиная с секунд = 0.

> nSeconds <- 5
> agg <- aggregate(Data[,-1], by=list(as.numeric(Data$Time) %/% nSeconds), mean)
> agg[,1] <- .POSIXct(agg[,1]*nSeconds)  # >= R-2.12.0 required for .POSIXct
0 голосов
/ 21 марта 2019

зоопарк имеет метод rollapply().Если вы не можете использовать это, я катал свои собственные несколько раз.Это не очень сложно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...