Объединить непрерывный набор 15-минутных временных рядов с прерывистым набором 15-минутных временных рядов
Довольно плохо знаком с R, я ценю любую помощь, которую вы можете мне дать по этому вопросу.
У меня есть два набора данных по 15-минутным временным рядам, которые я хотел бы объединить. Затем я хотел бы отобразить комбинацию переменных из этого объединенного набора данных на общей оси X. Вот подвох, в одном из наборов данных отсутствуют значения / даты. Давайте назовем наборы данных A и B.
А имеет столбец даты и времени, отформатированный как posixlt, и 14 числовых переменных (связанных с качеством воды). Чтения с 15-минутными интервалами. Однако временной ряд неполный, некоторые показания из-за ошибки оборудования отсутствуют. B также имеет 15-минутный интервал столбец даты и времени, отформатированный как posixlt и 1 числовая переменная. Однако этот ряд является непрерывным, то есть без пропущенных данных.
Вот сокращенный пример, но данные охватывают около 6 месяцев, причем эта проблема повторяется случайным образом повсюду (данные уведомления А пропускают показание 2:45):
Temp Turb DATETIME Q DATETIME
1 21 5 2017-03-19 02:00:00 1 3 2017-03-19 02:00:00
2 15 5 2017-03-19 02:15:00 2 3 2017-03-19 02:15:00
3 18 5 2017-03-19 02:30:00 3 3 2017-03-19 02:30:00
4 17 17 2017-03-19 03:00:00 4 5 2017-03-19 02:45:00
5 18 5 2017-03-19 03:15:00 5 7 2017-03-19 03:00:00
6 17 5 2017-03-19 03:30:00 6 6 2017-03-19 03:15:00
7 17 6 2017-03-19 03:45:00 7 4 2017-03-19 03:30:00
8 3 2017-03-19 03:45:00
Вот код для сокращенного примера.
A<- data.frame("DATE" =c("3/19/17","3/19/17","3/19/17","3/19/17",
"3/19/17","3/19/17","3/19/17"), "TIME"=c("02:00:00","02:15:00",
"02:30:00","03:00:00","03:15:00","03:30:00","03:45:00"),
"Temp" = c(21,15,18,17,18,17,17), "Turb" = c(5,5,5,17,5,5,6))
A$DATETIME <-paste(A$DATE,A$TIME)
A$DATETIME <- strptime(A$DATETIME, "%m/%d/%y %H:%M:%S")
A<-subset( A, select = -c(DATE,TIME) )
B <- data.frame("DATE" =c("3/19/17","3/19/17","3/19/17","3/19/17",
"3/19/17","3/19/17","3/19/17","3/19/17"), "TIME"=c("02:00:00","02:15:00",
"02:30:00","02:45:00","03:00:00","03:15:00","03:30:00","03:45:00"),
"Q" = c(3,3,3,5,7,6,4,3))
B$DATETIME <-paste(B$DATE,B$TIME)
B$DATETIME <- strptime(B$DATETIME, "%m/%d/%y %H:%M:%S")
B<-subset( B, select = -c(DATE,TIME) )
Я надеялся использовать padr, чтобы заполнить пропущенные данные в A пробелами, чтобы числовые переменные из A и B можно было взаимозаменять со временем A и B. К сожалению, 15 минут - это нестандартный интервал времени для использования padr. Я посмотрел примеры переполнения стека, и самое близкое, что я смог найти, было здесь, но я не смог заставить его работать. Он расширил мой набор данных до 1-минутных интервалов данных, но NA заменил все мои числовые переменные даже на 15-минутной отметке. Ошибки включали операторы, такие как переменная DateTime была несортированной.
Любые другие рекомендации или более конкретные рекомендации по связанному примеру? Спасибо!!!
2 ответа
Вы можете решить эту проблему с помощью xts, но имейте в виду, что xts похожа на матрицу: она может хранить только один тип данных. Кроме того, вы должны использовать POSIXct
вместо POSIXlt
, если вам не нужен доступ к конкретным элементам, содержащимся в POSIXlt
объекты.
require(xts)
a <- xts(A[,c("Temp","Turb")], as.POSIXct(A$DATETIME))
b <- xts(B["Q"], as.POSIXct(B$DATETIME))
(x <- merge(a, b))
# Temp Turb Q
# 2017-03-19 02:00:00 21 5 3
# 2017-03-19 02:15:00 15 5 3
# 2017-03-19 02:30:00 18 5 3
# 2017-03-19 02:45:00 NA NA 5
# 2017-03-19 03:00:00 17 17 7
# 2017-03-19 03:15:00 18 5 6
# 2017-03-19 03:30:00 17 5 4
# 2017-03-19 03:45:00 17 6 3
Если вы хотите, вы можете преобразовать результат обратно в data.frame:
d <- data.frame(DATETIME=index(x), x)
# remove the rownames, if you want
rownames(d) <- NULL
print(d)
# DATETIME Temp Turb Q
# 1 2017-03-19 02:00:00 21 5 3
# 2 2017-03-19 02:15:00 15 5 3
# 3 2017-03-19 02:30:00 18 5 3
# 4 2017-03-19 02:45:00 NA NA 5
# 5 2017-03-19 03:00:00 17 17 7
# 6 2017-03-19 03:15:00 18 5 6
# 7 2017-03-19 03:30:00 17 5 4
# 8 2017-03-19 03:45:00 17 6 3
Делает full_join
дать вам желаемый результат? В приведенном ниже коде нам нужно конвертировать DATETIME
в POSIXct
формат, но вы можете конвертировать обратно после, если это необходимо.
library(dplyr)
A$DATETIME = as.POSIXct(A$DATETIME)
B$DATETIME = as.POSIXct(B$DATETIME)
AB = full_join(A, B, by="DATETIME") # a dplyr function
Temp Turb DATETIME Q 1 21 5 2017-03-19 02:00:00 3 2 15 5 2017-03-19 02:15:00 3 3 18 5 2017-03-19 02:30:00 3 4 17 17 2017-03-19 03:00:00 7 5 18 5 2017-03-19 03:15:00 6 6 17 5 2017-03-19 03:30:00 4 7 17 6 2017-03-19 03:45:00 3 8 NA NA 2017-03-19 02:45:00 5
С базой R эквивалент будет:
AB = merge(A,B, by="DATETIME", all=TRUE)