2017-03-31 1 views
0

Je suis assez nouveau pour R, et j'apprécie toute aide que vous pouvez m'apporter à ce sujet.Fusionner un jeu de données chronologiques continues de 15 min avec un jeu de données discontinues de séries chronologiques de 15 min

J'ai deux séries de séries chronologiques de 15 minutes que je voudrais fusionner. Je voudrais ensuite tracer une combinaison de variables à partir de cet ensemble de données fusionnées sur un axe x commun. Voici la capture, l'un des jeux de données est des valeurs/dates manquantes. Appelons les jeux de données A et B.

A a une colonne date-heure au format posixlt et 14 variables numériques (liées à la qualité de l'eau). Les lectures sont à intervalles de 15 minutes. Cependant, la série temporelle est incomplète, certaines lectures, en raison d'une erreur d'équipement, sont manquantes. B a également une colonne date-heure d'intervalle de 15 minutes au format posixlt et une variable numérique. Cependant, cette série est continue, c'est-à-dire sans données manquantes.

Voici un exemple raccourci mais les données couvre environ 6 mois, ce problème répété au hasard tout au long (avis données A manque la lecture 2h45):

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 

Voici le code de la écourtée Exemple.

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)) 

J'espérais utiliser EPRD pour remplir les données manquantes en A avec des blancs afin que les variables numériques de A et B peuvent être tracées de façon interchangeable avec le temps de A et B. Malheureusement, 15 minutes est un temps non standard intervalle pour l'utilisation de padr. J'ai regardé le débordement de pile pour des exemples et le plus proche que j'ai pu trouver était here mais ne pouvait pas le faire fonctionner. Il a étoffé mon jeu de données à des intervalles de données d'une minute, mais les NA ont remplacé toutes mes variables numériques, même à la marque des 15 minutes. Les erreurs incluaient des instructions telles que la variable DateTime non triée.

D'autres recommandations ou des conseils plus spécifiques sur l'exemple lié? Merci!!!

Répondre

0

Est-ce qu'un full_join vous donne la sortie désirée? Dans le code ci-dessous, nous devons convertir DATETIME au format POSIXct, mais vous pouvez convertir retour après, si nécessaire.

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 

Avec base R, l'équivalent serait:

AB = merge(A,B, by="DATETIME", all=TRUE) 
1

Vous pouvez résoudre cela avec XTS, mais gardez à l'esprit que XTS est comme une matrice: il peut stocker uniquement un type de données. En outre, vous devez utiliser POSIXct au lieu de POSIXlt, sauf si vous devez accéder aux éléments spécifiques contenus dans les objets 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 

Si vous le souhaitez, vous pouvez convertir le résultat à un 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