[RESOLU]Recherche de valeurs à l'aide d'intervalle de date

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

jeremy garin
Messages : 2
Enregistré le : 27 Mar 2018, 15:52

[RESOLU]Recherche de valeurs à l'aide d'intervalle de date

Messagepar jeremy garin » 27 Mar 2018, 17:33

Bonjour,
Je cherche à rapatrier dans un dataframe à l'aide d'une date (dans l'exemple df Enreg), des données (temp et hygr) dans un autre dataframe dans lequel des intervalles de dates sont disponibles (df TabClim2).
J'utilise pour manipuler les dates le package lubridate.

Code : Tout sélectionner

deb1<-c("2017-05-09 21:57:58","2017-05-09 22:12:58","2017-05-09 22:27:58","2017-05-09 22:42:58")
deb1<- as.character(deb1)
temp<-c(13.269,12.401,11.625,11.110)
hygr<-c(62,70,71,72)
tabClim<-data.frame(deb1,temp,hygr)
tabClim[,1]<-as.character(tabClim[,1])
tabClim$deb1<-as.POSIXct(strptime(tabClim$deb1, "%Y-%m-%d %H:%M:%S"),tz="UTC")
deltaT<-tabClim[2,1]-tabClim[1,1]
deltaT<-as.numeric(deltaT)
tabClim2<-as.data.frame(tabClim[-nrow(tabClim),])
tabClim2$finSeq<-tabClim[-1,1]
tabClim2$interval2<-interval(tabClim2[,1]-(deltaT*60/2),tabClim2$finSeq-(deltaT*60/2))


Enreg<-c("2017-05-09 21:50:00","2017-05-09 22:11:25","2017-05-09 22:17:26","2017-05-09 22:51:08","2017-05-09 21:53:00","2017-05-09 22:10:35","2017-05-09 22:19:56","2017-05-09 22:01:08")
Enreg<- as.character(Enreg)
tabAna<-data.frame(Enreg)
tabAna$Enreg<-as.POSIXct(strptime(tabAna$Enreg, "%Y-%m-%d %H:%M:%S"),tz="UTC")



J'ai commencé par réaliser une boucle mais qui ne fonctionne uniquement que si les données existent dans tabClim2...Arrghhh, ce qui n'est pas le cas dans mon exemple

Code : Tout sélectionner

for (i in 1:nrow(tabAna))
{
tabAna$Temp2<-tabClim2[tabAna$Enreg[i] %within% tabClim2$interval2==TRUE,2]
}


Vu le nombre de données à traiter, la boucle ne me semble pas optimal par contre je n'arrive pas à avancer avec les fonctions apply, mes tentatives sont du type:

Code : Tout sélectionner

res <- sapply(tabAna$Enreg, function(x) which( x %within% tabClim2$interval2,arr.ind=T))


Je souhaiterai avoir un appui pour comprendre et avancer sur ces "deux solutions". Merci par avance

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Re: Recherche de valeurs à l'aide d'intervalle de date

Messagepar Logez Maxime » 28 Mar 2018, 13:06

Bonjour,

une solution pour être les plus efficace est de savoir s'il vaut mieux faire varier dans ton sapply les valeurs de tabAna$Enreg comme tu l'as fait ou les valeurs de tabClim2$interval2. Les deux fonctions vont renvoyées la même chose au sens près (en ligne ou en colonne) :

Code : Tout sélectionner

# test un df avec les lignes de tabAna répétées 10 000 fois
test <- tabAna[rep(1:nrow(tabAna, 1e4)), , drop = F]

require(microbenchmark)
microbenchmark(sapply(tabClim2$interval, function(x) test$Enreg %within% x),
  sapply(test$Enreg, '%within%', tabClim2$interval))
Unit: milliseconds
                                                         expr         min          lq       mean      median        uq
 sapply(tabClim2$interval, function(x) test$Enreg %within% x)    5.661203    7.744792   18.80032    9.950525   13.0777
            sapply(test$Enreg, "%within%", tabClim2$interval) 2210.702142 2367.965691 2442.11682 2437.347324 2492.9499
        max neval
   99.20243   100
 2817.60198   100
Il n'y pas de doutes. En même temps ici l'opération est répétée soit 3 fois (si on fait le sapply sur les valeurs d'intervalles) soit 80 000 fois (si on fait le sapply sur les valeurs de Enreg. Tu dois pouvoir gagner encore un peu de temps avec vapply plutôt que sapply.

Il est évident que si le nombre d'intervalles augmente l'écart va se réduire. Il faut donc que appliques le sapply sur le vecteur qui contient le moins de valeurs.

Cordialement,
Maxime

jeremy garin
Messages : 2
Enregistré le : 27 Mar 2018, 15:52

Re: Recherche de valeurs à l'aide d'intervalle de date

Messagepar jeremy garin » 10 Avr 2018, 13:52

Encore merci Maxime pour cette piste bien utile.

Voici la fin du script:

Code : Tout sélectionner

test<-sapply(tabClim2$interval2, function(x) tabAna$Enreg %within% x)
aa<-as.data.frame(which(test[,]==TRUE,arr.ind=TRUE))
temp1<-tabClim2[aa[,2],2]
hygr1<-tabClim2[aa[,2],3]
tabAna$Temp<-replace(tabAna$Temp,aa[,1],temp1)
tabAna$Hygr<-replace(tabAna$Hygr,aa[,1],hygr1)


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité