Усреднение непрерывного измерения метеорологических параметров по R

Я довольно плохо знаком с R и пытаюсь найти способ усреднения непрерывных данных за определенный период времени.

Мои данные - это месячная запись нескольких параметров с шагом 1 с. Таблица через read.csv имеет дату и время в одном столбце и несколько других столбцов со значениями.

TimeStamp UTC   Pitch   Roll    Heave(m)
05-02-13 6:45   0   0   0
05-02-13 6:46   0.75    -0.34   0.01
05-02-13 6:47   0.81    -0.32   0
05-02-13 6:48   0.79    -0.37   0
05-02-13 6:49   0.73    -0.08   -0.02

Поэтому я хочу усреднить данные в определенные промежутки времени: например, 20 минут, чтобы среднее значение за час 7:00, взяло все точки с часа 6:41 до 7:00 и вернуло среднее значение за этот интервал и т. Д. для всего набора данных. Временной интервал будет выглядеть так:

TimeStamp   
05-02-13 19:00  462
05-02-13 19:20  332
05-02-13 19:40  15
05-02-13 20:00  10
05-02-13 20:20  42

2 ответа

Решение

Вот воспроизводимый набор данных, похожий на ваш собственный.

meteorological <- data.frame(
  TimeStamp = rep.int("05-02-13", 1440),
  UTC       = paste(
    rep(formatC(0:23, width = 2, flag = "0"), each = 60),
    rep(formatC(0:59, width = 2, flag = "0"), times = 24),
    sep = ":"
  ),
  Pitch     = runif(1440),
  Roll      = rnorm(1440),
  Heave     = rnorm(1440)
)

Первое, что вам нужно сделать, это объединить первые два столбца, чтобы создать один (POSIXct) столбец даты и времени.

library(lubridate)
meteorological$DateTime <- with(
  meteorological,
  dmy_hm(paste(TimeStamp, UTC))
)

Затем установите последовательность точек останова для разных группировок времени.

breaks <- seq(ymd("2013-02-05"), ymd("2013-02-06"), "20 mins")

Наконец, вы можете рассчитать сводную статистику для каждой группы. Есть много способов сделать это. ddply от plyr пакет хороший выбор.

library(plyr)
ddply(
  meteorological,
  .(cut(DateTime, breaks)),
  summarise,
  MeanPitch = mean(Pitch),
  MeanRoll  = mean(Roll),
  MeanHeave = mean(Heave)
)

Пожалуйста, посмотрите, работает ли для вас что-то простое:

myseq <- data.frame(time=seq(ISOdate(2014,1,1,12,0,0), ISOdate(2014,1,1,13,0,0), "5 min"))
myseq$cltime <- cut(myseq$time, "20 min", labels = F)

> myseq
                  time cltime
1  2014-01-01 12:00:00      1
2  2014-01-01 12:05:00      1
3  2014-01-01 12:10:00      1
4  2014-01-01 12:15:00      1
5  2014-01-01 12:20:00      2
6  2014-01-01 12:25:00      2
7  2014-01-01 12:30:00      2
8  2014-01-01 12:35:00      2
9  2014-01-01 12:40:00      3
10 2014-01-01 12:45:00      3
11 2014-01-01 12:50:00      3
12 2014-01-01 12:55:00      3
13 2014-01-01 13:00:00      4
Другие вопросы по тегам