Объединить непрерывный набор 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)
Другие вопросы по тегам