2017-09-13 4 views
1

J'essaie de combiner deux grandes trames de données contenant des données de température provenant de plusieurs enregistreurs de données. Les enregistreurs de données et les noms de colonnes sont les mêmes dans chaque trame de données. Une trame de données contient des valeurs plus récentes que l'autre trame de données.Comment ajouter des données en fonction des valeurs de date qui se chevauchent?

Les données ressemble fondamentalement ceci:

date.time   date   temp1 temp2 
2011-08-22 19:00 2011-08-22 11.265 5.562 
2011-08-22 20:00 2011-08-22 11.254 6.541 
2011-08-22 22:00 2011-08-22 12.256 5.456 
2011-08-22 23:00 2011-08-22 13.568 15.265 

date.time<-c("2011-08-22 19:00", "2011-08-22 20:00", "2011-08-22 22:00","2011-08-22 23:00") 
date<-c("2011-08-22","2011-08-22","2011-08-22","2011-08-22") 
temp1<-c(11.265,11.254,12.256,13.568) 
temp2<-c(5.562,6.541,5.456,15.265) 
df_old<-data.frame(date.time,date,temp1,temp2) 

Et:

date.time   date   temp1 temp2 temp3 
2011-08-22 22:00 2011-08-22 12.256 5.456 24.598 
2011-08-22 23:00 2011-08-22 13.568 15.265 11.265 
2011-08-22 24:00 2011-08-22 11.275 5.563 25.295 
2011-08-23 00:00 2011-08-23 11.254 6.544 24.689 

date.time<-c("2011-08-22 22:00", "2011-08-22 23:00", "2011-08-22 24:00","2011-08-23 00:00") 
date<-c("2011-08-22","2011-08-22","2011-08-22","2011-08-23") 
temp1<-c(12.256,13.568,11.275,11.254) 
temp2<-c(5.456,15.265,5.563,6.544) 
temp3<-c(24.598,11.265,25.295,24.689) 
df_new<-data.frame(date.time,date,temp1,temp2,temp3) 

Je veux rejoindre ces ensemble de la longueur en fonction des valeurs partagées dans la colonne date.heure pour obtenir:

date.time   date   temp1 temp2 temp3 
2011-08-21 19:00 2011-08-22 11.265 5.562 NA 
2011-08-21 20:00 2011-08-22 11.254 6.541 NA 
2011-08-21 22:00 2011-08-22 12.256 5.456 24.598 
2011-08-21 23:00 2011-08-22 13.568 15.265 11.265 
2011-08-21 24:00 2011-08-22 11.275 5.563 25.295 
2011-08-21 00:00 2011-08-23 11.254 6.544 24.689 

J'ai essayé juste d'ajouter l'un à l'autre en utilisant rbind.fill.

df_all<-rbind.fill(df_old, df_new) 

Cela ne tient pas compte du nombre différent de colonnes. Cependant, il ajoute simplement les colonnes l'une au-dessus de l'autre au lieu de placer des lignes avec des valeurs partagées dans la colonne date.time. J'ai essayé de chercher comment faire cela mais j'ai seulement trouvé comment fusionner des blocs de données côte-à-côte en fonction des valeurs dans une colonne partagée mais pas comment les fusionner de haut en bas quand il y a chevauchement valeurs.

Merci!

Répondre

1

Il semble que ce que vous décrivez est une fusion:

merge(df_old,df_new,by=c("date.time","date","temp1","temp2"),all=TRUE) 

Sortie:

  date.time  date temp1 temp2 temp3 
1 2011-08-22 19:00 2011-08-22 11.265 5.562  NA 
2 2011-08-22 20:00 2011-08-22 11.254 6.541  NA 
3 2011-08-22 22:00 2011-08-22 12.256 5.456 24.598 
4 2011-08-22 23:00 2011-08-22 13.568 15.265 11.265 
5 2011-08-22 24:00 2011-08-22 11.275 5.563 25.295 
6 2011-08-23 00:00 2011-08-23 11.254 6.544 24.689 

Edit:

Comme @ eipi10 suggéré, une autre option pour faire le Idem:

library(dplyr) 

full_join(df_old, df_new) 
+1

Aussi 'library (dplyr); full_join (df_old, df_new) '. – eipi10