Усреднение непрерывного измерения метеорологических параметров по 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